【问题标题】:Calling an external function that contains 'time.sleep()' within a Tkinter window在 Tkinter 窗口中调用包含“time.sleep()”的外部函数
【发布时间】:2012-05-12 13:40:22
【问题描述】:

我试图通过按下 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)

有什么建议可以解决我在这里做错的任何事情吗?我确信这只是一个问题,我作为一个相当基本的用户,没有使用正确的语法。

附带说明一下,“睡眠”命令似乎也完全冻结了程序,我觉得这很烦人且没有吸引力。除了'管道'线程之外,是否有一种方法可以将循环暂停可变设置(例如,var = 1(秒))的时间量,这将是有效的并且更......干净?

谢谢。

【问题讨论】:

标签: python tkinter


【解决方案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 关键字的 aviod 名称冲突中。据我所知,main 不是关键字。

【讨论】:

  • 谢谢,这似乎可以阻止程序完全崩溃 :) 在这种情况下我使用了尾随 _,因为我已经从导入中包含了一个 'main' :) (这是一个烦人的功能名字,但是我第一次开始学习python时写了导入。你只是提醒我改变它。再次感谢。
  • @abkai -- 即使您使用from module import main,您仍然可以拥有一个具有名为main 的属性的类。
  • 哦,我想我想这也是真的哈哈。习惯的力量,我写剧本的时候不是在课堂上写的,然后我把它移到一个里试图让我的工作更整洁,我什至没有想过要改变它;还在学习python:P
【解决方案2】:

一般不要在单线程 GUI 中调用 time.sleep,否则您会发现它会阻塞。

处理休眠的正确方法是使用 GUI 事件。

请参阅another Stack Overflow 问题中的此示例,该示例展示了如何使用所有 TK 根窗口都有的 after 方法。

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多