python - Python:如何在 tkinter 窗口中显示 Twisted reactor 收到的 UDP 消息?
问题描述
我正在使用 tkinter 和 twisted 在 GUI 中显示 UDP 消息。这是我的代码:
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 窗口?
解决方案
收到数据后,您可以传递并更新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()
推荐阅读
- python - tf.keras.losses.categorical_crossentropy 返回错误值
- c++ - 您如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?
- c# - UWP MultipleView 示例菜单疯狂
- java - Fabric8 Maven 插件在运行构建时失败
- three.js - DirectionalLight 照明固定在 glTF 的一侧,即使 glTF 旋转时也是如此
- php - 使用 tax_query 过滤所有有货产品和特定类别缺货产品的帖子
- r - 基于不同变量的交互式连接
- docker - docker compose 网络的私有“主机”
- ios - SwiftUI 中的富文本视图
- haskell - 是否可以为 DSL 中的常量和表达式提供类型类?