Python 如何在另一个进程运行时更改tkinter标签?
我有一个很大的代码,按一下按钮就可以运行一个大约需要15秒才能完成的代码。在这段时间内,我想显示一个标签,上面写着“正在处理,请稍候”之类的内容。然而,在python中,使用tkinter创建的整个GUI将在过程结束后冻结和解冻。我该怎么做呢?我创建了一个较小的代码,以便更容易解释Python 如何在另一个进程运行时更改tkinter标签?,python,tkinter,Python,Tkinter,我有一个很大的代码,按一下按钮就可以运行一个大约需要15秒才能完成的代码。在这段时间内,我想显示一个标签,上面写着“正在处理,请稍候”之类的内容。然而,在python中,使用tkinter创建的整个GUI将在过程结束后冻结和解冻。我该怎么做呢?我创建了一个较小的代码,以便更容易解释 from tkinter import * from threading import Thread import os import sys import time master = Tk() master.ge
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”,然后在从0到4的计数中间看到“BBB”,然后在从0到4的最终计数末尾看到“CCC”。这里发生的是GUI在开始时冻结,计数继续,我只看到“CCC”。如何解决这个问题?使用线程只需进行一些必要的更改 首先创建一个函数开始试用: 然后使用新命令创建按钮:
butTest = Button(master, text='test', command=start_tryout)
然后,它将不再冻结gui,并且您应该能够看到标签的更改。使用线程只需进行一些更改 首先创建一个函数开始试用: 然后使用新命令创建按钮:
butTest = Button(master, text='test', command=start_tryout)
然后它将不再冻结gui,您应该能够看到标签的更改。您可以尝试线程化。我在下面对代码进行了修改,并在这里进行了测试,结果成功了
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( )
你可以试试穿线。我在下面对代码进行了修改,并在这里进行了测试,结果成功了
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( )
也许你可以使用线程。如果您认为我在使用线程,我在顶部导入了它,这是使用线程过程中的一个必要但不充分的部分。除其他事项外,您还需要创建一个线程对象。@Kevin是的,您是对的,我在顶部导入的“线程”是在我之前进行实验时,但在上载代码之前忘记将其删除。也许您可以使用线程。如果您认为我在使用线程,我在顶部导入了它,这是使用线程过程中的一个必要但不充分的部分。除其他外,您还需要创建一个线程对象。@Kevin是的,您是对的,我在顶部导入的“线程”是在我之前进行实验时,但在上载代码之前忘记将其删除。是的,此方法有效。很难找到涉及tkinter按钮的适当线程示例。谢谢是的,这个方法奏效了。很难找到涉及tkinter按钮的适当线程示例。谢谢这个方法确实有效,谢谢!我想我只需要了解python中线程是如何工作的,在tkinter中也是如此。顺便说一句,如果我想对另一个函数执行线程,那么我需要为它创建一个不同的线程,对吗?@CVith Yes。每个应该并行运行的函数都有一个线程。这个方法实际上很有效,谢谢!我想我只需要了解python中线程是如何工作的,在tkinter中也是如此。顺便说一句,如果我想对另一个函数执行线程,那么我需要为它创建一个不同的线程,对吗?@CVith Yes。应该并行运行的每个函数对应一个线程。