这里有几个问题:未正确调用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包发送/接收相关推荐

  1. python基于udp的网络聊天室再用tkinter显示_Python实现网络聊天室的示例代码(支持多人聊天与私聊)...

    实验名称: 网络聊天室 功能: i. 掌握利用Socket进行编程的技术 ii. 掌握多线程技术,保证双方可以同时发送 iii. 建立聊天工具 iv. 可以和单人聊天 v. 可以和多个人同时进行聊天 ...

  2. 【基于UDP的网络聊天室】

    总结下近期写的小项目,在学习中同时积累解决问题的经验,以及真正的项目中解决问题的思路,如有不合理地方,请多指教! 一.项目名称 基于UDP的网络聊天室 二.功能 1.当有新用户登录时,其他在线用户可以 ...

  3. 基于UDP的网络聊天室网络编程0811作业-洪庆乐

    项目:基于UDP的网络聊天室 功能:1.服务器日志系统,且可以查看(实现) 2.有用户,其他用户收到这个人登入信息(实现) 3.群发消息(实现) 4.如果有用户下线,其他用户收到下线消息(实现) 5. ...

  4. 【毕业设计之PHP系列】基于PHP的网络聊天室系统

    基于PHP的网络聊天室系统 摘要:我们生活在一个通信变得非常重要的世界里,人们需要同他人快速容易的进行交流.E-mail.电话.邮件以及在线聊天是以书写文字的形式让人们进行思想交流的媒体.通信时一个重 ...

  5. 基于TCP的网络聊天室实现(C语言)

    基于TCP的网络聊天室实现(C语言) 一.网络聊天室的功能 二.网络聊天室的结果展示 三.实现思路及流程 四.代码及说明 1.LinkList.h 2.LinkList.c 3.client.c 4. ...

  6. 【完整代码及文档】基于Java的网络聊天室系统的设计与实现

    摘 要 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有了日新月异的发展,它的发展速度和计算机 ...

  7. QT学习:基于TCP的网络聊天室程序

    TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用 ...

  8. javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)

    1 课程设计目的和任务 本项目的是实现在web应用上进行多人聊天,为以后在大型项目中实现客服在线服务做一个测试,提前了解HTML5新特性,熟练掌握websocket技术. 2 课程设计的主要内容 实现 ...

  9. 基于TCP的网络聊天室

    综合分析: 基于TCP的聊天室,支持多个用户同时登陆服务器进行聊天.(相当于群) socket编程,做一对多的通信,必然要用到多线程,保证多个客户端(并行)登陆服务器时同时进行聊天. 项目要求: 利用 ...

  10. 基于websocket的网络聊天室

    所用技术 socket.io socket.io是在websocket上进行了一层封装,让websocket变得更好用. express Express 是一个简洁而灵活的 node.js Web应用 ...

最新文章

  1. MFC菜鸟学编程——第一篇
  2. android 外键,android - 创建一个具有外键的sqlite数据库表,作为android中的表列。 我面临以下错误。 我该如何解决 - 堆栈内存溢出...
  3. 7种常用p2p共享协议
  4. 1024节日快乐~~~~
  5. html画布实现小球沿直线下落,[面向对象的案例]在canvas画布内实现小球的随机移动...
  6. Linux经典书籍推荐-转
  7. 阿里云部署flask
  8. 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 029期】
  9. 软件测试——测试用例的编写
  10. 多元统计分析基于r课后答案_应用多元统计分析课后答案.doc
  11. EBS中的销售员SQL
  12. python回到本次循环开头_如何循环回到程序的开头?Python
  13. java 运行 对象_java实例对象的编译时类型和运行时类型
  14. 国际信息研究学会专家杜彪:汉字识别是如何走上机器学习领域巅峰的?
  15. Linux下轻量级数据库-SQLite3(嵌入式设备)
  16. 高新技术企业认定四大要素知多少?
  17. YOLOF训练自己的数据集(目标检测,cvpods版本)
  18. Zcash中的Notes
  19. 大数据计算的6大关键技术与4大应用场景探索!
  20. 使用AS3.0开发FC超级马里奥

热门文章

  1. 计算机ps一级知识点,2017年计算机等级一级Photoshop常考知识点
  2. 【表盘识别】基于matlab投影法电表表盘读数识别【含Matlab源码 1101期】
  3. 【交通流预测】基于matlab BP神经网络短时交通流预测【含Matlab源码 687期】
  4. openai-gpt_GPT-3是“人类”吗?
  5. 10g添加用户 oracle_oracle10g下新建/删除用户
  6. .fit文件读取--head信息--修改head--读取csv文件-------ska暑期训练
  7. mac计算机如何调出来,新买的Mac电脑怎么设置?需完成这6步操作
  8. stm32产生100k时钟信号_stm32定时器时钟源时钟选择
  9. centos7安装RabbitMQ详细过程
  10. 数据结构与算法-二叉树遍历