如何在 tkinter 的后台运行一个函数

新手上路,请多包涵

我是 GUI 编程的新手,我想用 tkinter 编写一个 Python 程序。我想让它做的就是在后台运行一个可以通过 GUI 影响的简单功能。

该函数从 0 计数到无穷大,直到按下按钮。至少那是我想要它做的。但是我不知道如何在后台运行这个函数,因为 tkinter 的 mainloop() 一直在控制。如果我在无限循环中启动该函数,则无法执行 mainloop() 并且 GUI 已死。

我想在每个循环后将控制权返回给 mainloop(),但是如何在没有用户触发事件的情况下将控制权从 mainloop() 返回到 runapp 函数?

这是一些杀死 GUI 的示例代码:

 from Tkinter import *

class App:
    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="START", command=self.runapp)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="RESTART", command=self.restart)
        self.hi_there.pack(side=LEFT)

        self.runapp()

    def restart(self):
        print "Now we are restarting..."

    def runapp(self):
        counter = 0
        while (1):
            counter =+ 1
            time.sleep(0.1)

原文由 Demento 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

基于事件的编程在概念上很简单。试想一下,在程序文件的末尾有一个简单的无限循环:

 while <we have not been told to exit>:
    <pull an event off of the queue>
    <process the event>

因此,要连续运行一些小任务,您需要做的就是将其分解成小块并将这些小块放入事件队列中。每次通过循环时,您的计算的下一次迭代将自动执行。

您可以使用 after 方法将对象放置在事件队列中。因此,创建一个递增数字的方法,然后重新安排自身在几毫秒后运行。它看起来像:

 def add_one(self):
    self.counter += 1
    self.after(1000, self.add_one)

以上将每秒更新一次计数器。当你的程序初始化时,你调用它一次,然后它会导致自己被一次又一次地调用,等等。

此方法仅在您可以将大问题(在您的情况下为“永远计数”)分解为小步骤(“添加一个”)时才有效。如果您正在执行诸如缓慢的数据库查询或大量计算之类的操作,则此技术不一定有效。

原文由 Bryan Oakley 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏