首页 > 解决方案 > Tkinter GUI 窗口在后台停止工作

问题描述

我正在尝试使用 Tkinter 作为它的 GUI 创建一个 Python 数据分析器。该程序的工作是提取数据,对其执行一些计算,然后在 Tkinter GUI 上显示结果。使用这些显示的结果,我将在另一个应用程序上执行其他任务。我的问题是,一旦我单击其他应用程序(或任何不是 Tkinter GUI 窗口的应用程序),GUI 就会停止像以前那样实时显示信息。

即使我正在使用其他应用程序,我也希望 GUI 仍然显示数据。

这是示例代码,可以让您了解我正在尝试做的事情:

from tkinter import *
from time import sleep

root = Tk()
var = StringVar()
var.set('hello')

l = Label(root, textvariable = var)
l.pack()

for i in range(100):
    sleep(0.5)
    var.set('goodbye' if i%2 else 'hello')
    root.update_idletasks()

因此,如果您运行该程序并单击其他内容,例如桌面,则窗口将在显示的最后一个单词处冻结。

标签: pythonuser-interfacetkinter

解决方案


而不是使用time.sleep阻塞 tkinter 主线程的循环,您应该使用root.after这种操作:

from tkinter import *

root = Tk()
var = StringVar()
var.set('hello')

l = Label(root, textvariable = var)
l.pack()

def func(counter):
    var.set("goodbye" if counter % 2 else "hello")
    counter+=1
    if counter<100:
        root.after(500, func, counter)

root.after(500, func, 0)

root.mainloop()

推荐阅读