python做一个qq聊天窗口_python实现qq聊天(带界面)
本节我们实现了类似qq通讯聊天的功能,即你和好友之间可以相互发送和接受消息,为了美化,我们还增加了gui界面实现.
首先为了接受和发送消息,我们需要用socket编程,socket编程分为tcp和udp,我们在这里用tcp实现通讯.
其次,为了实现gui页面,我们用了python自带的gui图形库,即tkinter库.
我们需要分别编写客户端和服务端的代码,即要编写两套代码,不过客户端和服务端的实现细节大同小异,除了通讯方面代码略微不同,gui界面部分都是一样的,下面我们来编写代码.
服务端代码:
from tkinter import *
import socket
import sys
import threading
import time
class Server1:
def __init__(self): #初始化创建socket套接字,并且调用start1方法绘制界面
self.serv1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.serv1.bind(('localhost',9980))
self.serv1.listen(5)
self.client,self.addr=self.serv1.accept()
self.start1()
def __del__(self): #析构函数,当程序退出时,执行该函数,主要是为了关闭创建的socket套接字
self.serv1.close()
self.client.close()
def start1(self): #界面绘制
self.init1=Tk()
self.init1.title("服务端聊天工具")
self.init1.geometry('290x160')
self.init1["bg"]='pink'
self.init1.attributes("-alpha",0.8)
self.text1=Text(self.init1,width=60,height=20)
self.text1.place(x=20,y=50)
self.w=Label(self.init1,text="服务端信息框",width=60)
self.w.place(x=20,y=20)
self.bu=Button(self.init1,text="发送",command=self.add1)
self.bu.place(x=20,y=430)
self.text2=Text(self.init1,width=25,height=3)
self.text2.place(x=80,y=430)
self.init1.after(1000,self.get2) #这里调用了after方法,即隔一段时间执行事件
self.init1.mainloop()
def get2(self): #创建线程
t=threading.Thread(target=self.get1)
t.setDaemon(True)
t.start()
self.init1.after(1000,self.get2) #这里与上面的after方法一致,这样就能每隔一段时间执行
def get1(self): #此函数是为了判断对方有没有发送消息,如果有,就在文本框显示对方发送的消息
msg=self.client.recv(1024)
if msg is not None:
msg=msg.decode('utf-8')
self.text1.insert("end","客户端发来的消息:" + msg + "\n")
def add1(self): #这是按钮事件,即button点击事件,点击后,发送文本框消息
temp=self.text2.get(1.0,"end")
temp=temp
self.client.send(temp.encode('utf-8'))
self.text1.insert("end","你发送的消息:" + temp+ "\n")
self.text2.delete(1.0,"end")
a=Server1()
下面是客户端代码
客户端代码:
from tkinter import *
import socket
import sys
import threading
import time
class Client1:
def __init__(self):
self.client1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.client1.connect(('localhost',9980))
self.start1()
def __del__(self):
self.client1.close()
def start1(self):
self.init1=Tk()
self.init1.title("客户端聊天工具")
self.init1.geometry('290x160')
self.init1["bg"]='pink'
self.init1.attributes("-alpha",0.8)
self.text1=Text(self.init1,width=60,height=20)
self.text1.place(x=20,y=50)
self.w=Label(self.init1,text="客户端信息框",width=60)
self.w.place(x=20,y=20)
self.bu=Button(self.init1,text="发送",command=self.add1)
self.bu.place(x=20,y=430)
self.text2=Text(self.init1,width=25,height=3)
self.text2.place(x=80,y=430)
self.init1.after(1000,self.get2)
self.init1.mainloop()
def get2(self):
t=threading.Thread(target=self.get1)
t.setDaemon(True)
t.start()
self.init1.after(1000,self.get2)
def get1(self):
msg=self.client1.recv(1024)
if msg is not None:
msg=msg.decode('utf-8')
self.text1.insert("end","服务端发来的消息:" + msg+"\n")
def add1(self):
temp=self.text2.get(1.0,"end")
temp1=temp
self.client1.send(temp1.encode('utf-8'))
self.text1.insert("end","你发送的消息:" + temp + "\n")
self.text2.delete(1.0,"end")
a=Client1()
我讲解一下主要函数,get1函数类似于文本框监听事件,当对方有发送消息时,就将对方发送的消息显示到文本框,get2函数创建线程,在线程里面调用get1函数,并且用了after方法,即每隔一段时间就执行事件,间隔时间是1秒.
说明一下,之前我没有写get2方法,即没有创建线程,在线程里面调用间隔事件.我之前是直接在start1方法里面调用get1函数.
但是这样造成程序gui界面卡死,运行不了,具体原因不清楚,用了get2函数,在线程里面调用间隔事件就可以了,至于具体原因我还不清楚.
下面贴一下程序运行界面贴图:
这是服务端的聊天界面:
这是客户端的聊天界面:
可以看到,客户端和服务端都可以正常接受和发送消息,在这里,客户端和服务端分别相当于你和你朋友聊天.
所以这样我们就实现类似qq聊天功能.
完成这个小项目,还是学了不少东西,比如socket套接字(即网络编程),gui编程,以及多线程的初步学习,而且中间还是遇到了一些困难,使我感觉到,有些东西,看起来很简单,但是可能中间一些知识点你不懂,你就无法进行下去,而我们在看别人的代码时,很可能会自动忽略跳过这些困扰的坑,这就是动手去敲和看代码的区别
所以我们平时不要只是一味去看,重要的是多敲,只有多敲,你才会遇到真正的坑,才会想怎么去解决,这也是我本次的一个感悟吧!
好了,就写这么多吧,拜拜~
python做一个qq聊天窗口_python实现qq聊天(带界面)相关推荐
- python做一个考试系统_Python在线考试系统防作弊功能的思路和实现
我自己用Python开发了一套教学管理软件,具有在线点名.提问.答疑.交作业.自测.在线考试.数据导入导出与汇总.Word试卷生成等多个功能,其中在线考试系统具有防作弊的功能,不少人觉得很神奇,其实思 ...
- python做一个销售管理系统_python实现手机销售管理系统
本文实例为大家分享了python实现手机销售管理系统的具体代码,供大家参考,具体内容如下 要求如下: 手机销售系统 手机品牌 手机价格 库存数量 vivoX9 ...
- python做一个系统代码_python初学者,用python3实现基本的学生管理系统代码实例...
这篇文章分享了管理系统,python学生管理系统的使用,这篇文章非常详细地介绍了通过示例代码实现的学生管理系统,该系统对每个人的研究或工作都有一定的参考学习价值. 这个是用python实现的基本的增删 ...
- python做一个考试系统_python考试系统 相关实例(示例源码)下载 - 好例子网
开发语言:Python | 大小:0.02M | 发布时间:2016-07-07 | 发布人:linq 相关标签: 立即下载 开发语言:Python | 大小:0.21M | 发布时间:2020-08 ...
- python做一个立体相册_python使用库绘制立体图形方法
不同于往日,这次实现3D图形,小编给大家带来了一个新的库,这里用到的VisPy库,比起matplot更高级,非常容易上手,虽然知道了解的人可能不是很多,但是这丝毫不影响它是非常简单实用的,好啦,回归本 ...
- python做一个星座分析_Python 画简易中文星座
这段时间出于兴趣,写了一个简单的画星座的代码,效果觉得还不错,所以就发在这里.有兴趣的朋友可以前往以下地址下载:oxno2/star-chart-CNgithub.com 现在画星座的软件已经非常之 ...
- python做桌面应用程序_Python如何实现图形化界面制作为桌面软件?
我觉得这个问题提的有点不清楚,从两个角度理解吧. 1. Python图形化开发,我觉得第1个回答满对的,我再详细说说. 2. Python程序打包,其实是第2个回答的内容,少了平台的限定,如果只是wi ...
- python做一个登录注册界面_python做一个登录注册界面的方法
python做一个登录注册界面的方法 发布时间:2020-08-21 10:37:05 来源:亿速云 阅读:111 作者:小新 这篇文章主要介绍python做一个登录注册界面的方法,文中介绍的非常详细 ...
- 【Python】如何用python做一个简单的输入输出交互界面?
看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...
- python实战扫码下载_实例:用 Python 做一个扫码工具
原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...
最新文章
- 菜鸟学iPhone开发-计算器实例(实现篇)
- 根证书和中间证书的区别
- 单刹车信号不合理故障_关于汽车制动系统有哪些故障?该如何解决?
- mybatis foreach 错误_MyBatis高级结果映射之一对一映射
- Linux使用笔记: 设置Samba服务器中新建文件/目录的权限
- mft按钮设计_火力发电厂典型MFT逻辑控制实现.pdf
- 计算机系统军训口号,霸气的军训口号大全
- Nginx实现HTTP反向代理配置
- Spring事务管理全面分析
- vba java 网页_通过VBA提交JSP网站的Java脚本表单
- centos vim编辑器 第八节课
- 计算机毕业设计中民宿平台信息管理系统设计
- 总结之使用lowagie.text添加PDF水印
- HB哈勃与HB公链【尊皇社区】深度揭秘分析!
- ssh登录报错Pseudo-terminal will not be allocated because stdin is not a terminal
- 微信支付申请相关问题
- 阿里大数据之路:数据模型篇大总结(收藏)
- 微信公众号素材下载之java
- 【学习笔记之Openlayers3】要素保存篇(第四篇)
- 基本题型记录-二叉树中序遍历
热门文章
- 基于三维点云的机器人杆件目标识别与抓取(三)
- anaconda安装完怎么打开_10分钟带你安装和配置Anaconda
- 用ps制作动态图片教程
- 谈谈新加坡的教育和学区房
- SSD讲堂三(视频)_SSD_tensorflow_imageio方法_视频检测_附源码
- 工业相机和普通相机的区别详解_工业数字相机和普通相机的区别
- 手机恢复出厂设置命令_OpenWRT 恢复出厂设置命令
- 沉默的潜意识音频Creator软件
- mysql课设体会_课程设计心得体会8篇
- 72个炫酷的CSS技巧