Как включить многопоточность с помощью tkinter? - PullRequest
0 голосов
/ 18 декабря 2018

Когда я хочу собрать программу, например часы, на Python3, возникает проблема с многопоточностью и tkinter.

my_code:

#!/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 голосов
/ 16 января 2019

решено

#!/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()
0 голосов
/ 18 декабря 2018

Многопоточность не так уж и сложна, однако в этом случае многопоточность из-за простой временной петли излишня.

Мы можем использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...