tkinter回调异常_使用matplotlib保存动画时Tkinter回调出现异常
我在問這個問題時有點猶豫,因為似乎有很多“Tkinter回調異常”的問題,但我找不到一個適合我這里的問題。在
我試圖用matplotlib和ffmpeg保存MP4動畫(滲透模擬)。這段代碼在我的家用筆記本電腦上可以正常工作,但在我的工作電腦上不行。如果我用plt.show()替換anim.save行,它也可以正常工作,但我確實想保存動畫。我在Ubuntu17.04上使用Python3.5.2(我已經安裝了ffmpeg)。在
錯誤如下:>>> Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1558, in __call__
return self.func(*args)
File "/usr/lib/python3.5/tkinter/__init__.py", line 604, in callit
func(*args)
File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 373, in idle_draw
self.draw()
File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 354, in draw
FigureCanvasAgg.draw(self)
File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py", line 474, in draw
self.figure.draw(self.renderer)
File "/usr/lib/python3/dist-packages/matplotlib/artist.py", line 62, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/python3/dist-packages/matplotlib/figure.py", line 1165, in draw
self.canvas.draw_event(renderer)
File "/usr/lib/python3/dist-packages/matplotlib/backend_bases.py", line 1809, in draw_event
self.callbacks.process(s, event)
File "/usr/lib/python3/dist-packages/matplotlib/cbook.py", line 563, in process
proxy(*args, **kwargs)
File "/usr/lib/python3/dist-packages/matplotlib/cbook.py", line 430, in __call__
return mtd(*args, **kwargs)
File "/usr/lib/python3/dist-packages/matplotlib/animation.py", line 661, in _start
self._init_draw()
File "/usr/lib/python3/dist-packages/matplotlib/animation.py", line 1221, in _init_draw
self._draw_frame(next(self.new_frame_seq()))
StopIteration
產生錯誤的代碼是:
^{pr2}$
如果有必要,我可以為Percolator類重新生成代碼,但這部分工作正常。它有兩個函數:update_iter,一個生成函數,只要動畫繼續,就會產生{};和{},它以(迭代器的結果和)im作為輸入,最后兩行是im.set_array(self.states)
return im,
更新:
這是一個MWE。在import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
class Percolator:
def __init__(self):
self.i = 0
self.states = np.zeros((10, 10))
self.end = False
def update(self, garbage=None, im=None):
self.i += 1
if self.i == 10:
self.end = True
im.set_array(self.states)
return im,
def update_iter(self):
while self.end == False:
yield True
def percolate():
perc = Percolator()
fig, ax = plt.subplots()
im = plt.imshow(perc.states)
anim = animation.FuncAnimation(fig, perc.update, perc.update_iter, repeat=False, \
fargs=(im, ), save_count=100)
anim.save("perc.gif", writer="imagemagick")
在這個例子中,Percolator類沒有做任何有趣的事情——它設置了一個10x10的網格,每個對其update函數的調用都會將圖像設置為相同的10x10網格。在
如果FuncAnimation的frames屬性設置為50(例如),而不是設置為perc.update_iter,則沒有錯誤,圖像將正確保存。所以問題似乎出在我的發電機函數上。我想使用generator函數,因為我想不斷地創建新的幀,直到滿足perc.states的某些條件為止——這里,無聊的是,我只是要求它繼續進行10次迭代。在
系統詳細信息:python3.5.3、matplotlib 2.0.0、ubuntu17.04。在
更新2:
升級到matplotlib 2.0.2后出現相同問題。同時,打印一些輸出會顯示錯誤發生在迭代結束時。實際上,如果update_iter更改為:def update_iter(self):
print(self.end)
while self.end == False:
yield True
。。。則輸出為:False
False
False
False
False
False
False
False
False
False
False
True
>>> True
Exception in Tkinter callback
Traceback (most recent call last):
etc.
總結
以上是生活随笔為你收集整理的tkinter回调异常_使用matplotlib保存动画时Tkinter回调出现异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚊子为什么总叮我
- 下一篇: 两会用的车证有收藏价值吗