Python 从队列中获取消息时更新标签

Python 从队列中获取消息时更新标签,python,tkinter,queue,python-multithreading,Python,Tkinter,Queue,Python Multithreading,我正在尝试更新标签,以便在通过队列接收数字时显示正在倒计时的数字。我可以看到它正在控制台中打印,但标签没有改变。任何帮助或建议都会有帮助 这是我的密码: 将tkinter作为tk导入 导入时间 导入线程 导入队列 类GUI应用程序: 定义初始化(自): self.root=tk.tk() self.buttonCountDown=tk.Button(text='countdown',command=self.countdown动作) self.buttonCountDown.pack() sel

我正在尝试更新标签,以便在通过队列接收数字时显示正在倒计时的数字。我可以看到它正在控制台中打印,但标签没有改变。任何帮助或建议都会有帮助

这是我的密码:

将tkinter作为tk导入
导入时间
导入线程
导入队列
类GUI应用程序:
定义初始化(自):
self.root=tk.tk()
self.buttonCountDown=tk.Button(text='countdown',command=self.countdown动作)
self.buttonCountDown.pack()
self.label=tk.label(text='default')
self.label.pack()
self.queue=queue.queue()
self.root.mainloop()
def倒计时(自身,秒):
对于范围内的i(秒,0,-1):
self.queue.put(一)
时间。睡眠(1)
def listenToQueue(自):
尽管如此:
尝试:
如果self.queue.empty()==False:
打印(self.queue.get(0))
self.label['text']=self.queue.get(0)
elif self.queue.empty()==True:
通过
队列除外。空:
通过
def倒计时动作(自我):
listenThread=threading.Thread(target=self.listenToQueue)
listenThread.start()
thread=threading.thread(target=self.countDown,args=(5,))
thread.start()
thread.join()
app=GUIApp()

您需要知道的第一件事是
Queue.get()
删除项目并返回它,类似于
dict.pop()
。因此,当您执行
打印(self.queue.get(0))
时,该项已从队列中删除。如果要打印和配置它,必须首先将其分配给变量:

def listenToQueue(self):
    while True:
        try:
            if self.queue.empty() == False:
                s = self.queue.get(0)
                print (s)
                self.label['text'] = s
            elif self.queue.empty() == True:
                pass
        except queue.Empty:
            pass
接下来,调用
thread.join()
将等待线程终止。在当前设置中根本不需要调用此方法

def countDownAction(self):
    listenThread = threading.Thread(target=self.listenToQueue)
    listenThread.start()
    thread = threading.Thread(target=self.countDown, args=(5,))
    thread.start()
    #thread.join() #not required

这样做,我可以改变标签为1,但我没有看到它倒计时5,4,3,2,1。我的倒计时方法有问题吗?你是否注释掉了
线程。加入
?我可以看到倒计时到1刚刚好与上述两个修正。抱歉,我没有评论出来,是的,它现在的工作完美。如果我想在线程完成后做些什么呢?我必须使用thread.join()吗?我只想在for循环之外的倒计时函数末尾添加任何需要执行的操作。我明白了。在倒计时功能之外有没有其他方法?