Python 之后,取消作为停止方法的使用
我正在尝试使用after_cancel停止简单图像查看器中的动画循环。我已经阅读了关于Tcl的文档,在这里和谷歌搜索了一下,并探索了python子插件。我的错误是:Python 之后,取消作为停止方法的使用,python,python-2.7,tkinter,pillow,Python,Python 2.7,Tkinter,Pillow,我正在尝试使用after_cancel停止简单图像查看器中的动画循环。我已经阅读了关于Tcl的文档,在这里和谷歌搜索了一下,并探索了python子插件。我的错误是: TclError: wrong # args: should be "after cancel id|command" 这发生在以下代码的最后一行(请不要因为使用globals而杀了我,这个项目只是一个图像查看器,用于在我们的办公室中显示天气预报产品): n_图像=2 images=[PhotoImage(file=“filena
TclError: wrong # args: should be "after cancel id|command"
这发生在以下代码的最后一行(请不要因为使用globals而杀了我,这个项目只是一个图像查看器,用于在我们的办公室中显示天气预报产品):
n_图像=2
images=[PhotoImage(file=“filename”+str(i)+“.gif”)表示范围内的i(n_图像)]
当前图像=-1
def change_image():
displayFrame.delete('Animate')
displayFrame.create_图像(0,0,锚点=NW,
image=images[current_image],tag='Animate')
displayFrame.update_idletasks()#强制重画
回调=无
def animate():
前进()
callback=root.after(1000,动画)
def forward():
全局当前图像
当前_图像+=1
如果当前\u图像>=n\u图像:
当前图像=0
更改图像()
def back():
全局当前图像
当前_图像-=1
如果当前图像<0:
当前图片=n图片-1
更改图像()
def stop():
root.after\u取消(回调)
如果有更合适的方法来停止Tkinter中的动画循环,请让我知道 在_cancel之后使用
的替代方法是,您可以使用一个额外的全局值来跟踪循环是否应该继续
should_continue_animating = True
def animate():
forward()
if should_continue_animating:
root.after(1000, animate)
def stop():
global should_continue_animating
should_continue_animating = False
额外的设计技巧:将所有函数转换为单个类的方法可能会很有用。然后你会有self.current\u image
和self。你应该继续设置动画而不是全局值。如果您想同时为多个图像设置动画,这将是一个很好的设计选择。在取消后使用的另一种选择是,您可以使用一个附加的全局值来跟踪循环是否应该继续
should_continue_animating = True
def animate():
forward()
if should_continue_animating:
root.after(1000, animate)
def stop():
global should_continue_animating
should_continue_animating = False
额外的设计技巧:将所有函数转换为单个类的方法可能会很有用。然后你会有self.current\u image
和self。你应该继续设置动画而不是全局值。如果要同时为多个图像设置动画,这将是一个很好的设计选择。此处的代码不是设置全局变量,而是设置局部变量:
callback = None
def animate():
forward()
callback = root.after(1000, animate)
在这里,callback
将保持设置为None
,因此您的root.after\u cancel(callback)
相当于root.after\u cancel(None)
,这是TK不喜欢的。尝试将动画设置功能更改为:
def animate():
global callback
forward()
callback = root.after(1000, animate)
免责声明:我同意Kevin的观点,globals的繁殖速度很快,并且打开了它们的主控键,所以使用一个类。然后这些变量被锁定,无法访问。此处的代码不是设置全局变量,而是设置局部变量:
callback = None
def animate():
forward()
callback = root.after(1000, animate)
在这里,callback
将保持设置为None
,因此您的root.after\u cancel(callback)
相当于root.after\u cancel(None)
,这是TK不喜欢的。尝试将动画设置功能更改为:
def animate():
global callback
forward()
callback = root.after(1000, animate)
免责声明:我同意Kevin的观点,globals的繁殖速度很快,并且打开了它们的主控键,所以使用一个类。然后,变量被锁定,无法获取您的答案。调用停止
的位置在哪里?在回答您对我之前版本的问题的回答时,我说animate需要全局回调
将其添加并编辑到我的答案中。调用停止
的位置在哪里?在回答您对我答案的评论时对于这个问题的前一个版本,我说animate needsglobal callback
添加并编辑到了我的答案中。好,我担心我遗漏了其他问题。好,我担心我遗漏了其他问题。