我试图通过按下 Tkinter GUI 中的按钮来调用外部函数;函数“插入”到文本元素中。这很有效;只要 time.sleep() 没有紧随其后。如果没有遵循,文本会正确更新;如果是,文本不会更新,尽管该函数似乎仍在运行循环,因为它会愉快地将文本打印到控制台。
这是我的示例脚本:
from Tkinter import *
from time import sleep
def test_function(gui_self):
while True:
print "Debug message"
gui_self.main_.insert(END, "Test")
class GUI:
def __init__(self, master):
frame = Frame(master, width=300, height=500)
frame.pack()
self.main_ = Entry(frame, width=80, justify=CENTER)
self.main_.pack()
test_function(self)
root = Tk()
application = GUI(root)
root.mainloop()
这很好用。但是,将 test_function 更改为以下内容似乎会把事情搞砸:
def test_function(gui_self):
while True:
print "Debug message"
gui_self.main_.insert(END, "Test")
sleep(5)
有什么建议可以解决我在这里做错的问题吗?我确信这只是我作为一个相当基础的用户没有使用正确语法的问题。
附带说明一下,“ sleep ”命令似乎也会完全卡住程序,我觉得这很烦人而且没有吸引力。有没有一种方法可以将循环暂停可变设置(例如,var = 1(秒))的时间量,而不是“管道”线程,这将是高效且更..干净的?
谢谢。
请您参考如下方法:
我完全同意 Nick Craig-Wood 的回答——不要让 gui 的主线程休眠。通常,您希望在 after 之后调用,它会注册一个函数,以便在(大约)X 毫秒之后调用。这是一个每 5 秒调用一次 test_function 的示例。每次调用 test_function 时,它都会重新注册自己以在 5 秒后调用。
def test_function(gui_self):
print "Debug message"
gui_self.main_.insert(END, "Test")
gui_self.after(5000,test_function,gui_self)
#the line below also should work. As long as the item is a Tkinter widget
#gui_self.main_.after(5000,test_function,gui_self)
此外,完全不相关,(但作为风格问题)——您在 GUI 中使用 main_ 而不仅仅是 main 是有原因的吗?通常,尾部下划线附加到避免与 python 关键字的名称冲突。据我所知,main 不是关键字。
