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

我正在尝试使用after_cancel停止简单图像查看器中的动画循环。我已经阅读了关于Tcl的文档,在这里和谷歌搜索了一下,并探索了python子插件。我的错误是:

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 needs
global callback
添加并编辑到了我的答案中。好,我担心我遗漏了其他问题。好,我担心我遗漏了其他问题。