本节我们实现了类似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聊天(带界面)相关推荐

  1. python做一个考试系统_Python在线考试系统防作弊功能的思路和实现

    我自己用Python开发了一套教学管理软件,具有在线点名.提问.答疑.交作业.自测.在线考试.数据导入导出与汇总.Word试卷生成等多个功能,其中在线考试系统具有防作弊的功能,不少人觉得很神奇,其实思 ...

  2. python做一个销售管理系统_python实现手机销售管理系统

    本文实例为大家分享了python实现手机销售管理系统的具体代码,供大家参考,具体内容如下 要求如下: 手机销售系统 手机品牌                手机价格    库存数量 vivoX9   ...

  3. python做一个系统代码_python初学者,用python3实现基本的学生管理系统代码实例...

    这篇文章分享了管理系统,python学生管理系统的使用,这篇文章非常详细地介绍了通过示例代码实现的学生管理系统,该系统对每个人的研究或工作都有一定的参考学习价值. 这个是用python实现的基本的增删 ...

  4. python做一个考试系统_python考试系统 相关实例(示例源码)下载 - 好例子网

    开发语言:Python | 大小:0.02M | 发布时间:2016-07-07 | 发布人:linq 相关标签: 立即下载 开发语言:Python | 大小:0.21M | 发布时间:2020-08 ...

  5. python做一个立体相册_python使用库绘制立体图形方法

    不同于往日,这次实现3D图形,小编给大家带来了一个新的库,这里用到的VisPy库,比起matplot更高级,非常容易上手,虽然知道了解的人可能不是很多,但是这丝毫不影响它是非常简单实用的,好啦,回归本 ...

  6. python做一个星座分析_Python 画简易中文星座

    这段时间出于兴趣,写了一个简单的画星座的代码,效果觉得还不错,所以就发在这里.有兴趣的朋友可以前往以下地址下载:oxno2/star-chart-CN​github.com 现在画星座的软件已经非常之 ...

  7. python做桌面应用程序_Python如何实现图形化界面制作为桌面软件?

    我觉得这个问题提的有点不清楚,从两个角度理解吧. 1. Python图形化开发,我觉得第1个回答满对的,我再详细说说. 2. Python程序打包,其实是第2个回答的内容,少了平台的限定,如果只是wi ...

  8. python做一个登录注册界面_python做一个登录注册界面的方法

    python做一个登录注册界面的方法 发布时间:2020-08-21 10:37:05 来源:亿速云 阅读:111 作者:小新 这篇文章主要介绍python做一个登录注册界面的方法,文中介绍的非常详细 ...

  9. 【Python】如何用python做一个简单的输入输出交互界面?

    看到知乎上有人在问,如何使用Python做一个简单的输入输出交互界面? 交互界面就涉及到GUI编程. Python有很多GUI框架,功能大同小异. 其中比较出名的有「PyQT」.**wxPython. ...

  10. python实战扫码下载_实例:用 Python 做一个扫码工具

    原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...

最新文章

  1. 菜鸟学iPhone开发-计算器实例(实现篇)
  2. 根证书和中间证书的区别
  3. 单刹车信号不合理故障_关于汽车制动系统有哪些故障?该如何解决?
  4. mybatis foreach 错误_MyBatis高级结果映射之一对一映射
  5. Linux使用笔记: 设置Samba服务器中新建文件/目录的权限
  6. mft按钮设计_火力发电厂典型MFT逻辑控制实现.pdf
  7. 计算机系统军训口号,霸气的军训口号大全
  8. Nginx实现HTTP反向代理配置
  9. Spring事务管理全面分析
  10. vba java 网页_通过VBA提交JSP网站的Java脚本表单
  11. centos vim编辑器 第八节课
  12. 计算机毕业设计中民宿平台信息管理系统设计
  13. 总结之使用lowagie.text添加PDF水印
  14. HB哈勃与HB公链【尊皇社区】深度揭秘分析!
  15. ssh登录报错Pseudo-terminal will not be allocated because stdin is not a terminal
  16. 微信支付申请相关问题
  17. 阿里大数据之路:数据模型篇大总结(收藏)
  18. 微信公众号素材下载之java
  19. 【学习笔记之Openlayers3】要素保存篇(第四篇)
  20. 基本题型记录-二叉树中序遍历

热门文章

  1. 基于三维点云的机器人杆件目标识别与抓取(三)
  2. anaconda安装完怎么打开_10分钟带你安装和配置Anaconda
  3. 用ps制作动态图片教程
  4. 谈谈新加坡的教育和学区房
  5. SSD讲堂三(视频)_SSD_tensorflow_imageio方法_视频检测_附源码
  6. 工业相机和普通相机的区别详解_工业数字相机和普通相机的区别
  7. 手机恢复出厂设置命令_OpenWRT 恢复出厂设置命令
  8. 沉默的潜意识音频Creator软件
  9. mysql课设体会_课程设计心得体会8篇
  10. 72个炫酷的CSS技巧