
Допустим, существует окно tkinter, запущенное в потоке. И в параллельном потоке прослушиваются команды с сервера. Возможно ли из потока прослушивающего команды, сгенерировать события в окне tkinter?
1 Ответы


Да, события tkinter без проблем передаются между потоками. К сожалению, нет возможности передать с событием какую-либо нагрузку. Но это легко решается использованием очереди:
from functools import partial import socket import threading import time import tkinter as tk import queue def worker(q, r): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('localhost', 1234)) s.listen(5) # Передаём серверный сокет в очередь, # чтобы главный поток мог прервать цикл q.put(s) while True: (c, address) = s.accept() # Передаём в очередь адрес подключившегося q.put(address) # Генерируем событие r.event_generate('<<Connection>>', when='tail') c.close() def on_connection(event, q=None, r=None): # Получаем данные из очереди data = q.get() tk.Label(r, text='Соединение с адреса {} и порта {}'.format(*data)).pack() # Создаём очередь q = queue.Queue() # Создаём окно root = tk.Tk() # "Передаём" в обработчик ссылки на очередь и окно handler = partial(on_connection, q=q, r=root) # Регистрируем обработчик для события подключения клиента root.bind('<<Connection>>', handler) # Создаём поток и передаём в него ссылки на очередь и окно t = threading.Thread(target=worker, args=(q, root)) t.start() # Получаем из очереди серверный сокет s = q.get() root.mainloop() s.close()