Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在另一个进程运行时更改tkinter标签?_Python_Tkinter - Fatal编程技术网

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

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

我有一个很大的代码,按一下按钮就可以运行一个大约需要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”,然后在从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。应该并行运行的每个函数对应一个线程。