Skip to main content
 首页 » 编程设计

python之在 Tkinter 窗口中调用包含 'time.sleep()' 的外部函数

2025年05月04日17tuyile006

我试图通过按下 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 不是关键字。