gpt4 book ai didi

python - Tkinter 退出命令无限循环

转载 作者:行者123 更新时间:2023-11-30 23:07:54 24 4
gpt4 key购买 nike

我在使用 tkinter 界面窗口的关闭按钮时遇到一些问题。我的工具实时显示一些视频,我使用 after 函数进行无限循环来实现这一点。

当我通过单击十字关闭 tkinter 窗口时,程序卡住。但是,当我单击该按钮时,会调用相同的函数,但它会正确关闭。

这是我为向您展示问题而编写的最简化的代码。有没有人有解释和解决方法?

(顺便说一句,我在 OSX 上使用 Python 2.7.8)

from Tkinter import *
from PIL import Image, ImageTk
import numpy as np

class Test():
def __init__(self, master):
self.parent = master
self.frame = Frame(self.parent)
self.frame.pack(fill=BOTH, expand=1)
self.mainPanel = Label(self.frame)
self.mainPanel.pack(fill=BOTH, expand=1)
self.closeButton = Button(self.frame, command=self.closeApp)
self.closeButton.pack(fill=BOTH, expand=1)

def closeApp(self):
print "OVER"
self.parent.destroy()

def task(tool):
print 'ok'
im = Image.fromarray(np.zeros((500, 500, 3)), 'RGB')
tool.tkim = ImageTk.PhotoImage(im)
tool.mainPanel['image'] = tool.tkim
root.after(1, task, tool)

def on_closing():
print "OVER"
root.destroy()

root = Tk()
root.wm_protocol("WM_DELETE_WINDOW", on_closing)
tool = Test(root)
root.after(1, task, tool)
root.mainloop()

现在,如果您使用较小的图像(例如 100*100)再次尝试,它会起作用。或者如果你在 after 函数中设置 100 的延迟,它也可以工作。但在我的应用程序中,我需要非常短的延迟时间,因为我正在显示视频并且图像大小为 900px*500px。

谢谢!

编辑(08/19):我还没有找到解决方案。但我可以使用 root.overrideredirect(1) 删除关闭按钮,然后在 Tk 中重新创建它,并使用以下命令添加拖动窗口: Python/Tkinter: Mouse drag a window without borders, eg. overridedirect(1)

编辑(08/20) : 事实上,我什至无法拖动窗口。该工具也卡住了!

最佳答案

您可能只需要终止动画循环即可。 after 返回一个作业 ID,可用于取消待处理的作业。

def task():
global job_id
...
job_id = root.after(1, task, tool)

def on_closing():
global job_id
...
root.after_cancel(job_id)

如果这些函数是对象的方法,那么您的代码可能会更简洁,因此您不必使用全局变量。另外,您应该有一个退出函数而不是两个。或者,让一个调用另一个,这样您就可以确定两者都经过完全相同的代码路径。

最后,除非确实需要,否则不应每秒调用函数 1000 次。如此频繁地调用它会让你的 UI 变得迟缓。

关于python - Tkinter 退出命令无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32014516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com