Я знаю, что у интерфейса Python Tk есть некоторые проблемы при использовании потоков, и я уже столкнулся с проблемами с ним. Моя идея теперь состоит в том, чтобы использовать Queue.Queue
для какой-либо передачи событий в основной цикл Tk, аналогично следующему примеру.
from Tkinter import *
import Queue
import time
# this queue will be filled by other threads
queue = Queue.Queue()
queue.put("Helloooo!")
queue.put("hi there, everyone!")
class Application(Frame):
def update(self):
while True:
try:
text = queue.get(False)
self.hi_there["text"] = text
time.sleep(3)
except Queue.Empty:
self.quit()
def create_widgets(self):
self.hi_there = Label(self)
self.hi_there["text"] = "Hello"
self.hi_there.pack({"side": "left"})
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.create_widgets()
root = Tk()
app = Application(master=root)
app.update()
app.mainloop()
Конечно, я не должен сам вызывать update
(это выполнит все до того, как пользовательский интерфейс даже будет показан), но мне нужен Tk, чтобы обработать это во время основного цикла.
Есть ли надежный способ сделать это с Tk, который не сломается при определенных обстоятельствах? Или я должен просто прибегнуть к Qt для этого?