当前位置: 首页 > 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 <条件表…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...