如何使用tkinter启用线程?

时间:2018-12-18 15:49:21

标签: python-3.x multithreading tkinter

当我想在Python3上构建像时钟这样的程序时,存在关于线程和tkinter的问题。

我的代码:

#!/usr/bin/python3
#-*-coding:utf-8-*-

import tkinter as tk,time,threading,queue

def update_time(in_q):
    while True:
        in_q.put(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))

class App_gui:
    def __init__(self,parent):
        self.top_frame = tk.Frame(parent)
        self.clock = tk.Label(self.top_frame)
        self.clock.pack()
        self.top_frame.pack()
        self.begin_thread()

    def begin_thread(self):
        self.clock_q = queue.Queue()
        self.clock_thread = threading.Thread(target=update_time(self.clock_q))
        self.clock_thread.start()
        self.listen()

    def listen(self):
        gate_time = self.clock_q.get()
        self.clock.config(text=gate_time)
        self.clock.after(200,self.listen)

if __name__ == '__main__':
    root = tk.Tk()
    my_app = App_gui(root)
    root.mainloop()

运行此代码时,什么都没有发生。

2 个答案:

答案 0 :(得分:0)

很好的线程并不是那么困难,但是在这种情况下,对于简单的时间循环来说,线程是过大的。

我们可以使用after()来管理时间标签,而不必使用线程。

import tkinter as tk
from time import strftime


class AppGUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.time_label = tk.Label(self)
        self.time_label.pack()
        self.track_time()

    def track_time(self):
        self.time_label.config(text="{}".format(strftime('%Y-%m-%d %H:%M:%S')))
        self.time_label.after(1000, self.track_time)

if __name__ == '__main__':
    AppGUI().mainloop()

答案 1 :(得分:0)

已解决

#!/usr/bin/env python3
#-*-coding:utf-8-*-

import threading,time,tkinter as tk

def clock_task():
    global clock_time
    while True:
        clock_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        time_label.config(text=clock_time)
        time.sleep(1)


clock_t = threading.Thread(target=clock_task)
clock_t.setDaemon(True)


root = tk.Tk()
time_label = tk.Label(root)
time_label.pack()
# start thread before mainloop
clock_t.start()
root.mainloop()