如何在另一个进程运行时更改tkinter标签?

时间:2018-05-04 12:58:04

标签: python tkinter

我有一个大型代码,按下按钮应该运行一个代码,大约需要15秒才能完成。在这段时间内,我想显示一个标签,上面写着"处理,请稍候"或类似的东西。但是在python中,一旦程序结束,使用tkinter创建的整个GUI将冻结并解冻。我该如何解决这个问题?我创建了一个较小的代码,以便我可以更容易地解释。

from tkinter import *
from threading import Thread
import os
import sys
import time

master = Tk()
master.geometry("500x500")
master.resizable(False,False)

def tryout():
    sign2.config(text = "AAA")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "BBB")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "CCC")

def close_window(): 
    master.destroy()
    sys.exit()

sign1 = Label(master, text = "VNA GUI").grid(pady=10, padx=10)
sign2 = Label(master, text = "Choose option to continue")
sign2.grid(pady=10, padx=10, ipadx=50)
Button(master, text='Exit', command=close_window).grid(pady=10, padx=20)
butTest = Button(master, text='test', command=tryout)
butTest.grid(pady=10, padx=20)

master.mainloop( )

因此,在此代码中,我希望看到“AAA'首先在标签上,然后是' BBB'从0到4的计数中间,然后是CCC'在最终计数结束时从0到4.这里发生的是GUI开始冻结,计数继续进行,我只看到CCC'。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

使用线程进行此操作只需进行一些更改。

首先创建一个函数start_tryout

def start_tryout():
    Thread(target=tryout, daemon=True).start() # deamon=True is important so that you can close the program correctly

然后使用新命令创建按钮:

butTest = Button(master, text='test', command=start_tryout)

然后它应该不再冻结gui,你应该能够看到标签的变化。

答案 1 :(得分:2)

您可以尝试线程化。我在代码下面进行了更改,并在此处进行了测试,并且运行良好。

from tkinter import *
from threading import Thread
import os
import sys
import time
import threading  # NEW

master = Tk()
master.geometry("500x500")
master.resizable(False,False)

def tryout():
    sign2.config(text = "AAA")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "BBB")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "CCC")

def close_window():
    master.destroy()
    sys.exit()

def thread(): # NEW
    threading.Thread(target=tryout).start() # NEW


sign1 = Label(master, text = "VNA GUI").grid(pady=10, padx=10)
sign2 = Label(master, text = "Choose option to continue")
sign2.grid(pady=10, padx=10, ipadx=50)    
Button(master, text='Exit', command=close_window).grid(pady=10, padx=20)
butTest = Button(master, text='test', command=thread)  # Changed
butTest.grid(pady=10, padx=20)

master.mainloop( )