thinter聊天小工具

# 服务端
import queue
import re
import socket
import time
import tkinter as tk
from threading import Threadclass ChatService():def __init__(self):# 聊天框左上角名称self.title = f"马里奇聊天室"self.tk = tk.Tk(className=self.title)# 隐藏窗口# self.tk.withdraw()# 设置Tkinter窗口始终位于其他窗口的顶部# self.tk.attributes("-topmost", 1)"""固定窗口大小800x600:表示窗口的宽度为800像素,高度为600像素。+500:表示窗口在X轴上距离屏幕左侧500像素的位置。+200:表示窗口在Y轴上距离屏幕顶部200像素的位置。"""# self.tk.resizable(width=False, height=False)self.tk.geometry("800x600+500+200")  # 大小,位置# 基础信息ip_label = tk.Label(text=f"我的ip:{local_ip}")ip_label.grid(row=0, column=0, sticky=tk.W, padx=10, pady=10)# 标签top_label = tk.Label(text="聊天内容:")top_label.grid(row=1, column=0, sticky=tk.W, padx=10, pady=10)# send message,消息框self.text_message = tk.Text(height=20, width=60)# 配置标签用于右对齐self.text_message.tag_configure("right", justify='right')# 配置标签用于居中对齐self.text_message.tag_configure("left", justify='left')self.text_message.grid(row=2, column=0, padx=10, pady=10)center_label = tk.Label(text="发送内容:")center_label.grid(row=3, column=0, sticky=tk.W, padx=10, pady=10)# input message,消息框self.input_message = tk.Text(height=10, width=60)self.input_message.grid(row=4, column=0, padx=10, pady=10)# 按钮,发送消息self.bt1 = tk.Button(text='发送', command=self.retrieve_input)    # 实例化self.bt1.grid(row=4, column=1, sticky='ws', padx=10, pady=10)# 绑定回车键到 retrieve_input 函数# self.tk.bind('<Return>', self.retrieve_input)  # <Return> 是回车键的事件名称# self.input_message.focus_set()  # 设置焦点到 text 小部件,使其可以接收键盘输入# 对端基础信息,Frame是块概念,块内再加东西,挪位置,gridf1 = tk.Frame()dip_label = tk.Label(f1, text=f"填入对端ip:")dip_label.grid(row=0, column=0)# 接收对端ipself.enstr1 = tk.StringVar()self.one_entry = tk.Entry(f1, textvariable=self.enstr1, highlightcolor="Fuchsia", highlightthickness=1, width=20)self.one_entry.grid(row=0, column=1)f1.grid(row=0, column=1, sticky=tk.W, padx=10, pady=10)# 错误提示信息error_label = tk.Label(text="错误信息:")error_label.grid(row=1, column=1, sticky=tk.W, padx=10, pady=10)self.error_message = tk.Text(height=20, width=45)self.error_message.grid(row=2, column=1, sticky=tk.W, padx=10, pady=10)# 开始线程self.start_udp_recv_thread()# 启动self.tk.mainloop()def retrieve_input(self):"""1. 获取输入的文本内容2. 将内容添加到内容框3. udp发送消息4. 清空输入框:return:"""# 1. 获取输入的内容, "1.0" 表示从第一行第一个字符开始获取,tk.END 表示获取到文本框的最后。input_value = self.input_message.get("1.0", tk.END)input_value = input_value.strip()print(input_value.strip())  # 打印或处理输入的内容if not input_value:self.append_error_message("不能发送空白消息!")return# 3. 发送udp消息send_state = self.udp_send(input_value)if send_state:# 2. append_text_messageself.append_text_message(input_value)# 4. 清空文本框内容self.input_message.delete("1.0", tk.END)def append_error_message(self, message):"""添加错误信息你:return:"""self.error_message.config(state=tk.NORMAL)  # 临时设置为可编辑状态self.error_message.insert(tk.END, message + "\n" + "\n")  # 添加消息self.error_message.config(state=tk.DISABLED)  # 再次设置为不可编辑状态self.error_message.see(tk.END)  # 滚动到最新消息def append_text_message(self, input_value, direction='right'):# 2. 将内容添加到内容框now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))self.text_message.config(state=tk.NORMAL)  # 临时设置为可编辑状态self.text_message.insert(tk.END, now_time + "\n", direction)self.text_message.insert(tk.END, input_value + "\n" + "\n", direction)  # 添加消息self.text_message.config(state=tk.DISABLED)  # 再次设置为不可编辑状态self.text_message.see(tk.END)  # 滚动到最新消息def after_append_text_message(self):while not my_queue.empty():message = my_queue.get()self.flash_icon()self.append_text_message(message, direction='left')self.tk.after(100, self.after_append_text_message)def start_udp_recv_thread(self):print("开始启动线程")# 多线程接收消息t = Thread(target=udp_recv)t.daemon = Truet.start()self.tk.after(100, self.after_append_text_message)print("结束启动线程")def udp_send(self, message):"""发送udp消息:param message::return:"""host = self.enstr1.get()if not host or not is_str_ip_v4(host):self.append_error_message("请输入正确的接收方ip地址!")return Falsewith socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:s.sendto(message.encode(), (host, port))print("发送成功")return Truedef flash_icon(self):"""图标闪动:return:"""self.tk.bell()  # 发出系统警告声,可能会使图标闪烁self.tk.focus_force()  # 强制窗口获得焦点def is_str_ip_v4(ip_str):"""判断字符串是不是ipv4"""if ip_str is None:return Falsev4_regex = "^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]?\d)" \"(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]?\d)){3}$"return re.match(v4_regex, ip_str) is not Nonedef udp_recv():"""接收udp消息:return:"""with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:s.bind((local_ip, port))while True:data, addr = s.recvfrom(1024)  # 接收数据和客户端地址print(f"Received message: {data.decode()} from {addr}")my_queue.put(data.decode())def get_local_ip():try:# 创建一个 socket 对象s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 不必真的连接,只是用来获取本机IP地址s.connect(("8.8.8.8", 80))ip = s.getsockname()[0]s.close()return ipexcept Exception as e:print("无法获取本机IP地址:", e)return Noneif __name__ == '__main__':local_ip = get_local_ip()port = 51314my_queue = queue.Queue()ChatService()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社区检测(Community Detection)

如果你想进行社区检测&#xff08;Community Detection&#xff09;&#xff0c;你可以使用 NetworkX 库提供的一些算法。社区检测的目标是将图中的节点划分为若干个社区或群组&#xff0c;使得社区内的节点紧密相连而社区间的连接尽量稀疏。以下是一个使用 Louvain 方法进行社…

SpringBoot将第三方的jar中的bean对象自动注入到ioc容器中

新建一个模块&#xff0c;做自动配置 config&#xff1a;需要准备两个类&#xff0c;一个自动配置类&#xff0c;一个配置类 CommonAutoConfig&#xff1a;此类用于做自动配置类它会去读取resoutces下的META-INF.spring下的org.springframework.boot.autoconfigure.AutoConfig…

LabVIEW探测器CAN总线系统

介绍了一个基于FPGA和LabVIEW的CAN总线通信系统&#xff0c;该系统专为与各单机进行系统联调测试而设计。通过设计FPGA的CAN总线功能模块和USB功能模块&#xff0c;以及利用LabVIEW开发的上位机程序&#xff0c;系统成功实现了CAN总线信息的收发、存储、解析及显示功能。测试结…

图论第二天|695. 岛屿的最大面积 1020. 飞地的数量 130. 被围绕的区域 417. 太平洋大西洋水流问题 827.最大人工岛

目录 Leetcode695. 岛屿的最大面积Leetcode1020. 飞地的数量Leetcode130. 被围绕的区域Leetcode417. 太平洋大西洋水流问题Leetcode827.最大人工岛 Leetcode695. 岛屿的最大面积 文章链接&#xff1a;代码随想录 题目链接&#xff1a;695. 岛屿的最大面积 思路&#xff1a;dfs …

嘿嘿,vue之输出土味情话

有点好玩&#xff0c;记录一下。通过按钮调用网站接口&#xff0c;然后解构数据输出土味情话。 lovetalk.vue: <!--vue简单框架--> <template> <!-- 这是一个div容器&#xff0c;用于显示土味情话 --> <div class"talk"> <!-- 当点…

回归预测 | Matlab实现CPO-LSSVM【24年新算法】冠豪猪优化最小二乘支持向量机多变量回归预测

回归预测 | Matlab实现CPO-LSSVM【24年新算法】冠豪猪优化最小二乘支持向量机多变量回归预测 目录 回归预测 | Matlab实现CPO-LSSVM【24年新算法】冠豪猪优化最小二乘支持向量机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-LSSVM【24年…

大模型基础

大模型是什么 大模型是一种由大规模语言模型&#xff0c;由大量神经元组成&#xff0c;可以对输入的文本或者其他的类似视频图片语音等进行预测和生成&#xff0c;以便提供更多的信息给用户。这种模型通常基于深度学习技术和大规模语言模型训练&#xff0c;能够模拟人类的对话…

K个一组翻转链表---链表OJ

https://leetcode.cn/problems/reverse-nodes-in-k-group/?envType=study-plan-v2&envId=top-100-liked K个一组进行翻转,大体上是和前面两两翻转是类似的,区别就在于,这里需要自己判断是否需要翻转,如何翻转,怎么记录。这里我们用递归来实现。 是否需要翻转…

数据结构·单链表经典例题

1. 移除链表元素 OJ链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 本题是说给出一个链表的头节点head和一个整数val&#xff0c;如果发现节点中存的数据有val就删掉它&#xff0c;最后返回修改后的链表头节点地址 如果题目中没有明确…

第十八讲_HarmonyOS应用开发实战(实现电商首页)

HarmonyOS应用开发实战&#xff08;实现电商首页&#xff09; 1. 项目涉及知识点罗列2. 项目目录结构介绍3. 最终的效果图4. 部分源码展示 1. 项目涉及知识点罗列 掌握HUAWEI DevEco Studio开发工具掌握创建HarmonyOS应用工程掌握ArkUI自定义组件掌握Entry、Component、Builde…

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存&#xff1f; 2.Redis 一般在什么场合下使用&#xff1f; 3.redis为什么这么快&#xff1f; 4.Redis为什么要引入了多线程&#xff1f; 1.既然redis那么快&#xff0c;为什么不用它做主数据…

Nginx 配置解析:从基础到高级应用指南

Nginx 配置解析&#xff1a;从基础到高级应用指南 Nginx 配置解析&#xff1a;从基础到高级应用指南1. 安装和基本配置安装 Nginx基本配置 2. 虚拟主机配置3. 反向代理配置4. 负载均衡配置5. SSL 配置6. 高级配置选项结语 Nginx 配置解析&#xff1a;从基础到高级应用指南 Ngi…

C#使用OpenCvSharp4库读取电脑摄像头数据并实时显示

一、OpenCvSharp4库 OpenCvSharp4库是一个基于.Net封装的OpenCV库&#xff0c;Github源代码地址为&#xff1a;https://github.com/shimat/opencvsharp&#xff0c;里面有关于Windows下安装OpenCvSharp4库的描述&#xff0c;如下图所示&#xff1a; 二、C#使用OpenCvSharp4库…

java 中 this关键字

class Person {private double base;// 普通方法(非构造器方法)里的this&#xff0c;就是new出来的那个对象public double getBase(){ return this.base;}public void setBase(double b){this.base b }// 构造器中的this&#xff0c;是&#xff0c;当前正在new过程中的对象&am…

人机协同中的一阶谓词推理与态势信息增强

一阶谓词逻辑推理是指使用一阶谓词逻辑来进行推理和推断。在人机协同中&#xff0c;一阶谓词逻辑推理可以用于理解和解释人类用户的意图和需求&#xff0c;以及帮助机器理解和生成自然语言。 一阶谓词逻辑推理的基本原理是使用一组逻辑规则和事实&#xff0c;通过逻辑推理来得出…

Python tkinter (8) ——Spinbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 Pyt…

中间件安全

中间件安全 vulhub漏洞复现&#xff1a;https://vulhub.org/操作教程&#xff1a;https://www.freebuf.com/sectool/226207.html 一、Apache Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和…

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

💡 RT-DETR改进有效系列目录 💡 前言 Hello,各位读者们好 Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,…

智能小程序页面配置、运行机制及路由

页面介绍 Page 代表应用的一个页面&#xff0c;负责页面展示和交互。每个页面对应一个子目录&#xff0c;一般有多少个页面&#xff0c;就有多少个子目录。它也是一个构造函数&#xff0c;用来指定页面的初始数据、生命周期回调、事件处理函数等。 每个小程序页面一般包含以下…