Вызов события из другого потока

202 просмотра
0
0 Комментариев

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


Добавить комментарий

1 Ответы

Python Опубликовано 16.12.2018
0

Да, события 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()

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up