当前位置: 首页 > news >正文

tkinter界面的TCP通信/开启线程等待接收数据

前言

用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面,在测试的时候就利用TCP客户端来实验,文末会附上TCP客户端。本文分为三部分,第一部分是在界面向TCP发送数据,第二部分是接收TCP发送过来的数据,需要开启线程(因为界面是在不断刷新的,所以不开线程一直等待PLC发送数据过来,界面是会卡住的)。

一、向TCP客户端发送数据

1.导入相关库

import socket  #TCP
from tkinter import *

2.定义向TCP发送数据的函数

message_text 是通过文本框输入的内容,需要利用.get()来获取,这个涉及到Entery组件的方法,详见我之前写过的文章

# 向TCP服务端发送数据
def senddata(send_message):message_text = send_message.get() #获取文本内容socket_client.send(message_text.encode())  #发送

3.创建TCP客户端
注意其中的’127.0.0.1’是要与TCP客户端通信的IP地址,两边需要一致,2001是端口,也需要一致。

# 创建socket客户端变量
socket_client = ''
# 创建全局变量
global command
socket_client = socket.socket() #创建一个客户端对象
socket_client.connect(('127.0.0.1', 2001))  #设置IP地址及端口

4.主界面的程序
创建一个top对象界面,放置文本框接收用户输入的信息,按下“发送”按钮后,执行发送函数

# 主界面程序
top = Tk()
top.title("聊天窗口")  # 窗口标题
top.geometry("500x500")  # 窗口尺寸
top.configure(bg = "LightGreen")  # 窗口背景颜色
#发送窗口
Label(top ,text ="发送窗口" , font = ("微软雅黑",12), bg = "LightGreen").place(x= 50,y = 370) 
send_message = Entry(top,width=45)  #文本输入框
send_message.place(x=50 , y=400)  #摆放位置
Button(top,text = "发送",font = ("黑体",12), command = lambda: senddata(send_message)).place(x= 400,y = 395)   #发送按钮
top.mainloop()  # 消息循环

5.实现效果
记得要修改TCP客户端对应的IP和端口,然后打开开关!不能发送中文!会乱码
向TCP发送 hello

二、开线程接收TCP发过来的数据

我们继续在上述程序中增加接收信息的函数。因为要等待接收信息需要,所以要另外开启一个线程,防止一直等待
1.导入threading线程库

import socket
import threading
from tkinter import *

2.定义等待TCP发送来过数据的函数receive

# 等待TCP服务端发送信息
def receive():while 1:command = socket_client.recv(1024).decode()  #接收canvas.create_text(10,10,text = command,fill ='#7CCD7C',anchor = W,font =('微软雅黑',12))  #把接收的信息(文本)放在画布

3.主程序开启线程
这里我是放在创建top界面对象之前的。后面会有完整程序

# 创建socket客户端变量
socket_client = ''
# 创建全局变量
global command
socket_client = socket.socket()
socket_client.connect(('127.0.0.1', 2001))# 开启线程,用于接收receive,更新到界面
thread = threading.Thread(target=receive)  #receive函数
thread.daemon = True
thread.start() #启动线程
# 主界面程序
top = Tk()
top.title("聊天窗口")  # 窗口标题
top.geometry("500x500")  # 窗口尺寸
top.configure(bg = "LightGreen")  # 窗口背景颜色

4.设置画布接收信息
在主界面增加一个画布,用于接收从TCP客户端发送过来的信息。画布的创建可以看这里我之前写过写过的文章

#接收聊天信息的界面
Label(top ,text ="接收窗口" , font = ("微软雅黑",12), bg = "LightGreen").place(x= 50,y = 20) 
canvas= Canvas(top,width=400,height=300,bg="white")  #创建画布
canvas.place(x=50 , y=50)

5.实现效果

这样就完成了TCP客户端相互通信的程序,但是上述程序只是完成简单收发,可以看到TCP发送多次过来,画布上的文字信息是会重叠在第一行的,完整程序看最后。
接收TCP发送的信息

三、完整的程序

import socket
import threading
from tkinter import *# 向TCP服务端发送数据
def senddata(send_message):message_text = send_message.get() #获取文本内容socket_client.send(message_text.encode())  #发送
# 等待TCP服务端发送信息
def receive():k = 10  #文字在画布中初始高度while 1:command = socket_client.recv(1024).decode()  #接收if k <300:#canvas文本方法中的10是横坐标,k是纵坐标,k是一直在往下变化的canvas.create_text(10,k,text = command,fill ='#7CCD7C',anchor = W,font =('微软雅黑',12)) k = k+20  #每一行增加20个单位,往下显示else:k = 10 #直到满屏后,重回初始单位canvas.delete("all")  #写满之后清屏# 创建socket客户端变量
socket_client = ''
# 创建全局变量
global command
socket_client = socket.socket()
socket_client.connect(('127.0.0.1', 2001))# 开启线程,用于接收receive,更新到界面
thread = threading.Thread(target=receive)  #receive函数
thread.daemon = True
thread.start() #启动线程
# 主界面程序
top = Tk()
top.title("聊天窗口")  # 窗口标题
top.geometry("500x500")  # 窗口尺寸
top.configure(bg = "LightGreen")  # 窗口背景颜色#接收聊天信息的界面组件
Label(top ,text ="接收窗口" , font = ("微软雅黑",12), bg = "LightGreen").place(x= 50,y = 20) 
canvas= Canvas(top,width=400,height=300,bg="white")  #创建画布
canvas.place(x=50 , y=50)#发送窗口的组件
Label(top ,text ="发送窗口" , font = ("微软雅黑",12), bg = "LightGreen").place(x= 50,y = 370) 
send_message = Entry(top,width=45)  #文本输入框
send_message.place(x=50 , y=400)
Button(top,text = "发送",font = ("黑体",12),width = 7 , height = 1, command = lambda: senddata(send_message)).place(x= 400,y = 395)   #发送按钮top.mainloop()  # 消息循环

写了一个小学生作文
以上就是关于tkinter界面发送信息给TCP客户端及tkinter开启线程接收信息的方法。附件是TCP客户端软件网络调试助手 密码lyx4

相关文章:

tkinter界面的TCP通信/开启线程等待接收数据

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…...

华为OD机试题,用 Java 解【任务混部】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

看linux内核启动流程需要的汇编指令解释

一、指令 0.MRS 和MSR MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。 MSR指令: 对状态寄存器CPSR和SPSR进行写操作。 1.adrp adrp x0, boot_args把boot_args的页基地址提取出来&#xff0c;放到x0中。 2.stp stp x21, x1, [x0]将 x21, x1 的值存入 x0寄存器记录的地址中…...

【巨人的肩膀】JAVA面试总结(二)

1、&#x1f4aa; 目录1、&#x1f4aa;1.0、什么是面向对象1.1、JDK、JRE、JVM之间的区别1.2、什么是字节码1.3、hashCode()与equals()之间的联系1.4、String、StringBuffer、StringBuilder的区别1.5、和equals方法的区别1.6、重载和重写的区别1.7、List和Set的区别1.8、Array…...

【网络安全入门】零基础小白必看!!!

看到很多小伙伴都想学习 网络安全 &#xff0c;让自己掌握更多的 技能&#xff0c;但是学习兴趣有了&#xff0c;却发现自己不知道哪里有 学习资源◇瞬间兴致全无&#xff01;◇ &#x1f604;在线找人要资料太卑微&#xff0c;自己上网下载又发现要收费0 &#x1f643;差点当…...

字节前端经典面试题(附答案)

有哪些可能引起前端安全的问题? 跨站脚本 (Cross-Site Scripting, XSS): ⼀种代码注⼊⽅式, 为了与 CSS 区分所以被称作 XSS。早期常⻅于⽹络论坛, 起因是⽹站没有对⽤户的输⼊进⾏严格的限制, 使得攻击者可以将脚本上传到帖⼦让其他⼈浏览到有恶意脚本的⻚⾯, 其注⼊⽅式很简…...

数据库管理工具的使用

目录 摘要 一、Navicat是什么&#xff1f; 二、使用步骤 1.如何下载与安装 2.如何连接远程数据库 总结 摘要 本文主要介绍数据库管理工具的使用 一、Navicat是什么&#xff1f; 它是一款数据库管理工具&#xff0c;将此工具连接数据库,你可以从中看到各种数据库的详细…...

让马斯克反悔的毫米波雷达,被国产雷达头部厂商木牛科技迭代到了5D时代

近日&#xff0c;特斯拉或将在其HW4.0硬件系统配置一枚高精度4D毫米波雷达的消息在外网刷屏。据分析&#xff0c;“纯视觉”信仰者马斯克之所以做出这样的决定&#xff0c;一方面是减配了雷达的特斯拉自动驾驶&#xff0c;表现不尽如人意&#xff1b;另一方面也跟毫米波雷达的技…...

MaxWell原理概述

文章目录1.MaxWell概述2.Maxwell输出数据格式3.Maxwell原理3.1 MySQL二进制日志3.2 MySQL主从复制1.MaxWell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、dele…...

电子技术——AB类输出阶

电子技术——AB类输出阶 原理 交越失真可以通过通过一个较小的偏置电流解除&#xff0c;如下图&#xff1a; QNQ_NQN​ 和 QPQ_PQP​ 的基极之间存在偏置电压 VBBV_{BB}VBB​ 。对于完美匹配的晶体管&#xff0c;当 vI0v_I 0vI​0 的时候&#xff0c;此时 vO0v_O 0vO​0 。每…...

Archlinux个人安装流程

操作环境&#xff1a; 时间&#xff1a;2023-02-17 电脑型号&#xff1a;联想拯救者R720 cpu&#xff1a;Intel Core i5-7300HQ 4x 3.5GHz gpu&#xff1a;NVIDIA GeForce GTX 1050 Ti 安装系统&#xff1a; 1.下载镜像&#xff1a; 请访问https://archlinux.org/查找镜…...

【Autoware】2小时安装Autoware1.13(保姆级教程)

前言&#xff1a;ROS的出现使得机器人软件开发更加快速和模块化&#xff0c;在此基础上&#xff0c;Autoware.ai开源项目可以让我们很容易地将一套完整的自动驾驶软件部署到我们的测试车辆上&#xff0c;并见证它跑起来&#xff01; 文章目录1.Autoware简介2.电脑软硬件配置要求…...

JVM 堆内存模型

方法区和永久代的关系 方法区与 Java 堆一样&#xff0c;是各个线程共享的内存区域&#xff0c;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分&#xff0c;但是它却有一个别名叫做 N…...

linux-中断下半部

引用preempt宋宝华&#xff1a; 是谁关闭了Linux抢占&#xff0c;而抢占又关闭了谁&#xff1f;Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十&#xff09;内核抢占实现(preempt)Linux中的preempt_count - 知乎 (zhihu.com)linux 中断子系统…...

SpringMVC源码:HandlerMapping加载1

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…...

【ArcGIS】12 投影

问题描述 在处理地理数据时,可能会遇到以下关于投影的问题: DEM缺少投影,提取流域会报错图层只有地理坐标系,没有投影坐标系,无法测量距离、计算面积等要素图层投影偏移量错误,与实际位置有偏差总之,投影对各种地理操作影响很大,有必要深入理解。 投影说明 在ArcGIS…...

【微信小程序-原生开发+TDesign】通用功能页封装——地点搜索(含腾讯地图开发key 的申请方法)

效果预览 核心技能点 调用腾讯地图官方的关键字地点搜索功能&#xff0c;详见官方文档 https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/methodGetsuggestion 完整代码实现 地点输入框 <t-input value"{{placeInfo.title}}" bindtap"searchPlace" dis…...

h5: 打开手机上的某个app

1、android端&#xff1a;直接通过URL Scheme方式打开。2、ios端&#xff08;2种&#xff09;&#xff1a;&#xff08;1&#xff09;使用URL Scheme方式打开。&#xff08;2&#xff09;使用Universal link方式打开。3、Universal link方式使用注意事项&#xff1a;&#xff0…...

Hot Chocolate 构建 GraphQL .Net Core 服务

Hot Chocolate 是 .NET 平台下的一个开源组件库, 您可以使用它创建 GraphQL 服务, 它消除了构建成熟的 GraphQL 服务的复杂性, Hot Chocolate 可以连接任何服务或数据源&#xff0c;并创建一个有凝聚力的服务&#xff0c;为您的消费者提供统一的 API。 我会在 .NET 应用中使用…...

linux shell 入门学习笔记16 流程控制开发

shell的流程控制一般包括if、for、while、case/esac、until、break、continue语句构成。 if语句开发 单分支if //方式1 if <条件表达式> then 代码。。。 fi //方式2 if <条件表达式>;then 代码。。。 fi 双分支if if <条件表达式> then 代码1 if <条件表…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...