python基于udp的网络聊天室再用tkinter显示_Python3:Tkinter gui中的UDP包发送/接收
这里有几个问题:未正确调用after函数。一个例子:self.after(self.DELAY, startreceiving(False), self.DELAY)。首先,它会立即调用startreceiving这不是您想要的。其次,after的第三个和后续参数作为回调函数的参数提供。所以您将self.DELAY作为一个参数发送给startreceiving,但该参数应该是一个布尔值,因为您对它进行了编码。
一个after函数不应该进入一个无限循环,因为它从tkinter窃取控制权。相反(正如@scotty3785所指出的),您应该为操作创建一个新线程,或者使after回调变短,然后让它自己“重新调度”。
作为一个有趣的学习练习,我重新编写了你的代码,发送者和接收者各有一个线程。在评论中包含了一些注释。在from threading import Thread
import time
import socket
import select
import tkinter as tk
import tkinter.font as tkFont
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
class Sender(Thread):
MESSAGE = b"Hello, world"
def __init__(self, sock):
# Call Thread constructor
super().__init__()
self.sock = sock
self.keep_running = True
def stop(self):
# Call this from another thread to stop the sender
self.keep_running = False
def run(self):
# This will run when you call .start method
while self.keep_running:
print("Sending Message.")
try:
self.sock.sendto(self.MESSAGE, (UDP_IP, UDP_PORT))
time.sleep(0.5) # REMOVE ME: Just to slow things down a bit for debugging
except socket.error as err:
print("Error from sending socket {}".format(err))
break
class Receiver(Thread):
def __init__(self, sock):
# Call Thread constructor
super().__init__()
self.sock = sock
self.keep_running = True
def stop(self):
# Call this from another thread to stop the receiver
self.keep_running = False
def run(self):
# This will run when you call .start method
while self.keep_running:
# We use select here so that we are not *hung* forever in recvfrom.
# We'll wake up every .5 seconds to check whether we should keep running
rfds, _wfds, _xfds = select.select([self.sock], [], [], 0.5)
if self.sock in rfds:
try:
data, addr = self.sock.recvfrom(1024)
print("received message:", data)
print("from: ", addr)
except socket.error as err:
print("Error from receiving socket {}".format(err))
break
class App(tk.Frame):
STRIDE = 8
DELAY = 100
# pythonic list comprehensions equivalent to your previous loops
variables = [i for i in range(10)]
sensors = [i for i in range(3)]
fields = [i for i in range(len(sensors) * len(variables))]
def __init__(self, sock, master=None):
# Call superclass constructor
super().__init__(master)
self.sock = sock
self.sender = None
self.receiver = None
self.grid()
self.create_widgets()
self.update()
# Create the GUI Layout
def create_widgets(self):
self.btn_font = tkFont.Font(family="Helvetica", size=12, weight='bold')
self.gui_buttons = []
# Buttons renamed for orthogonality
self.sstart_button = tk.Button(self,
text = format("Begin Sending."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
command = self.start_sending)
self.sstart_button.grid(column=2, row=11)
# Adding a stop button for the sender too
self.sstop_button = tk.Button(self,
text = format("Stop Sending."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
padx = 6,
state='disabled',
command = self.stop_sending)
self.sstop_button.grid(column=2, row=12)
self.rstart_button = tk.Button(self,
text = format("Begin Receiving."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
command = self.start_receiving)
self.rstart_button.grid(column=3, row=11)
self.rstop_button = tk.Button(self,
text = format("Stop Receiving."),
font = self.btn_font,
relief = tk.RIDGE,
pady = 4,
padx = 6,
state='disabled',
command = self.stop_receiving)
self.rstop_button.grid(column=3, row=12)
x = 0
y = 1
for i, label in enumerate(self.variables):
label = tk.Label(self,
text = format("Variable " + str(i)),
font = self.btn_font,
padx = 10)
label.grid(column=x, row=y)
y += 1
x = 1
y = 0
for i, label in enumerate(self.sensors):
sensor = tk.Label(self,
text = format("Sensor " + str(i)),
font = self.btn_font,
padx = 20,
relief = tk.RIDGE)
sensor.grid(column=x, row=y)
x += 1
x = 1
y = 1
for i, field in enumerate(self.fields):
field = tk.Entry(self,
width=10,
text=format("field val " + str(i)),
font=self.btn_font,
state='disabled')
field.grid(column=x, row=y)
y += 1
if y > len(self.variables):
y = 1
x += 1
def mainloop(self, *args):
# Overriding mainloop so that we can do cleanup of our threads
# *If* any arguments were provided, we would pass them on to Tk.frame
super().mainloop(*args)
# When main loop finishes, shutdown sender and/or receiver if necessary
if self.sender:
self.sender.stop()
if self.receiver:
self.receiver.stop()
# Start the receiver thread
def start_receiving(self):
self.rstart_button.config(state='disabled')
self.rstop_button.config(state='normal')
# Create and start receiver thread
self.receiver = Receiver(self.sock)
self.receiver.start()
# Stop the receiver
def stop_receiving(self):
self.rstop_button.config(state='disabled')
self.rstart_button.config(state='normal')
self.receiver.stop()
self.receiver.join()
self.receiver = None
# Start the sender thread
def start_sending(self):
self.sstart_button.config(state='disabled')
self.sstop_button.config(state='normal')
self.sender = Sender(self.sock)
self.sender.start()
# Stop the sender
def stop_sending(self):
self.sstop_button.config(state='disabled')
self.sstart_button.config(state='normal')
self.sender.stop()
self.sender.join()
self.sender = None
def main():
# Got rid of sock as global variable
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
app = App(sock)
app.master.title('ESDR')
app.master.geometry('640x480')
app.mainloop()
if __name__ == '__main__':
main()
python基于udp的网络聊天室再用tkinter显示_Python3:Tkinter gui中的UDP包发送/接收相关推荐
- python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...
实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...
- 【基于UDP的网络聊天室】
总结下近期写的小项目,在学习中同时积累解决问题的经验,以及真正的项目中解决问题的思路,如有不合理地方,请多指教! 一.项目名称 基于UDP的网络聊天室 二.功能 1.当有新用户登录时,其他在线用户可以 ...
- 基于UDP的网络聊天室网络编程0811作业-洪庆乐
项目:基于UDP的网络聊天室 功能:1.服务器日志系统,且可以查看(实现) 2.有用户,其他用户收到这个人登入信息(实现) 3.群发消息(实现) 4.如果有用户下线,其他用户收到下线消息(实现) 5. ...
- 【毕业设计之PHP系列】基于PHP的网络聊天室系统
基于PHP的网络聊天室系统 摘要:我们生活在一个通信变得非常重要的世界里,人们需要同他人快速容易的进行交流.E-mail.电话.邮件以及在线聊天是以书写文字的形式让人们进行思想交流的媒体.通信时一个重 ...
- 基于TCP的网络聊天室实现(C语言)
基于TCP的网络聊天室实现(C语言) 一.网络聊天室的功能 二.网络聊天室的结果展示 三.实现思路及流程 四.代码及说明 1.LinkList.h 2.LinkList.c 3.client.c 4. ...
- 【完整代码及文档】基于Java的网络聊天室系统的设计与实现
摘 要 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有了日新月异的发展,它的发展速度和计算机 ...
- QT学习:基于TCP的网络聊天室程序
TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用 ...
- javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)
1 课程设计目的和任务 本项目的是实现在web应用上进行多人聊天,为以后在大型项目中实现客服在线服务做一个测试,提前了解HTML5新特性,熟练掌握websocket技术. 2 课程设计的主要内容 实现 ...
- 基于TCP的网络聊天室
综合分析: 基于TCP的聊天室,支持多个用户同时登陆服务器进行聊天.(相当于群) socket编程,做一对多的通信,必然要用到多线程,保证多个客户端(并行)登陆服务器时同时进行聊天. 项目要求: 利用 ...
- 基于websocket的网络聊天室
所用技术 socket.io socket.io是在websocket上进行了一层封装,让websocket变得更好用. express Express 是一个简洁而灵活的 node.js Web应用 ...
最新文章
- MFC菜鸟学编程——第一篇
- android 外键,android - 创建一个具有外键的sqlite数据库表,作为android中的表列。 我面临以下错误。 我该如何解决 - 堆栈内存溢出...
- 7种常用p2p共享协议
- 1024节日快乐~~~~
- html画布实现小球沿直线下落,[面向对象的案例]在canvas画布内实现小球的随机移动...
- Linux经典书籍推荐-转
- 阿里云部署flask
- 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 029期】
- 软件测试——测试用例的编写
- 多元统计分析基于r课后答案_应用多元统计分析课后答案.doc
- EBS中的销售员SQL
- python回到本次循环开头_如何循环回到程序的开头?Python
- java 运行 对象_java实例对象的编译时类型和运行时类型
- 国际信息研究学会专家杜彪:汉字识别是如何走上机器学习领域巅峰的?
- Linux下轻量级数据库-SQLite3(嵌入式设备)
- 高新技术企业认定四大要素知多少?
- YOLOF训练自己的数据集(目标检测,cvpods版本)
- Zcash中的Notes
- 大数据计算的6大关键技术与4大应用场景探索!
- 使用AS3.0开发FC超级马里奥
热门文章
- 计算机ps一级知识点,2017年计算机等级一级Photoshop常考知识点
- 【表盘识别】基于matlab投影法电表表盘读数识别【含Matlab源码 1101期】
- 【交通流预测】基于matlab BP神经网络短时交通流预测【含Matlab源码 687期】
- openai-gpt_GPT-3是“人类”吗?
- 10g添加用户 oracle_oracle10g下新建/删除用户
- .fit文件读取--head信息--修改head--读取csv文件-------ska暑期训练
- mac计算机如何调出来,新买的Mac电脑怎么设置?需完成这6步操作
- stm32产生100k时钟信号_stm32定时器时钟源时钟选择
- centos7安装RabbitMQ详细过程
- 数据结构与算法-二叉树遍历