[英]Calling an external function that contains 'time.sleep()' within a Tkinter window
我试图通过按下Tkinter GUI中的按钮来调用外部函数; 函数“插入”到Text元素中。 这很完美; 只要没有紧随其后的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(second)),这会更有效且更干净。
谢谢。
我完全同意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关键字附加到aviod名称冲突中。 据我所知, main
不是关键字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.