Python: Как отобразить UDP-сообщение, полученное витым реактором, в окне tkinter? - PullRequest
0 голосов
/ 18 апреля 2020

Я использую tkinter и twisted для отображения сообщений UDP в формате GUI. Это мой код:

import tkinter as tk
from twisted.internet import tksupport, reactor
from twisted.internet.protocol import DatagramProtocol

class RX(DatagramProtocol):
    def datagramReceived(self, datagram, address):
        self.msg = datagram.decode('utf-8')
        self.transport.write(datagram, address)

class RX_GUI():
    def __init__(self):
        self.root = tk.Tk()
        tksupport.install(self.root)
        self.reactor = reactor.listenUDP(7201, RX())
        reactor.run()
        self.msg = tk.Label(self.root,text=self.reactor.msg)
        self.msg.grid()
        self.root.mainloop()


RX_GUI()

Вот некоторый сопутствующий код для отправки сообщений:

import socket
import time
ip = '127.0.0.1'
port = 7201
msg = "Hello World"
while True:
    sock = socket.socket(socket.AF_INET, # Internet
                         socket.SOCK_DGRAM) # UDP
    sock.sendto(msg.encode(), (ip, port))
    time.sleep(1)

Как я могу получить сообщение "Hello World" для отображения в окне tkinter, когда это получено?

1 Ответ

0 голосов
/ 19 апреля 2020

Вы можете передать self.msg на RX() и обновить его после получения данных:

class RX(DatagramProtocol):
    def __init__(self, widget):
        super().__init__()
        self.widget = widget

    def datagramReceived(self, datagram, address):
        self.msg = datagram.decode('utf-8')
        self.widget['text'] = self.msg  # update the label
        #self.transport.write(datagram, address)  # cause recursive issue

class RX_GUI():
    def __init__(self):
        self.root = tk.Tk()
        self.msg = tk.Label(self.root)
        self.msg.grid()
        self.root.protocol('WM_DELETE_WINDOW', self.quit)
        tksupport.install(self.root)
        self.reactor = reactor.listenUDP(7201, RX(self.msg)) # pass self.msg to RX()
        reactor.run()
        # no need to call self.root.mainloop()

    def quit(self):
        reactor.stop()
        self.root.destroy()

RX_GUI()
...