Python在线聊天软件(Tkinter)
1.python2.7下安装
apt-get install python-tk
主要功能是实现客户端与服务器端的双向通信,这个小东西用到的主要知识点:
1.Python Socket;
2.Python Tkinter库。
当然也应该了解如下的基础知识:
1.Python基本语法;
2.Python基本语句;
3.Python函数;
4.Python模块;
5.Python异常处理;
6.Python面向对象;
7.Python线程等相关知识。
另外:我使用的是Python2.5这个版本,如果你使用的Python3.0,可能不兼容。 推荐使用稳定的2.5版,linux系统默认安装的也是2.5这个版本,许多第三方库也是使用2.5这个版本。
下面是这个小东西的一个截图:
下面是服务器端代码:
# _*_ coding:utf-8 _*_
# Filename:ServerUI.py
# Python在线聊天服务器端 import Tkinter
import tkFont
import socket
import thread
import time
import sys class ServerUI(): title = 'Python在线聊天-服务器端V1.0'
local = '127.0.0.1'
port = 8808
global serverSock;
flag = False #初始化类的相关属性,类似于Java的构造方法
def __init__(self):
self.root = Tkinter.Tk()
self.root.title(self.title) #窗口面板,用4个frame面板布局
self.frame = [Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame()] #显示消息Text右边的滚动条
self.chatTextScrollBar = Tkinter.Scrollbar(self.frame[0])
self.chatTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y) #显示消息Text,并绑定上面的滚动条
ft = tkFont.Font(family='Fixdsys',size=11)
self.chatText = Tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)
self.chatText['yscrollcommand'] = self.chatTextScrollBar.set
self.chatText.pack(expand=1,fill=Tkinter.BOTH)
self.chatTextScrollBar['command'] = self.chatText.yview()
self.frame[0].pack(expand=1,fill=Tkinter.BOTH) #标签,分开消息显示Text和消息输入Text
label = Tkinter.Label(self.frame[1],height=2)
label.pack(fill=Tkinter.BOTH)
self.frame[1].pack(expand=1,fill=Tkinter.BOTH) #输入消息Text的滚动条
self.inputTextScrollBar = Tkinter.Scrollbar(self.frame[2])
self.inputTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y) #输入消息Text,并与滚动条绑定
ft = tkFont.Font(family='Fixdsys',size=11)
self.inputText = Tkinter.Text(self.frame[2],width=70,height=8,font=ft)
self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
self.inputText.pack(expand=1,fill=Tkinter.BOTH)
self.inputTextScrollBar['command'] = self.chatText.yview()
self.frame[2].pack(expand=1,fill=Tkinter.BOTH) #发送消息按钮
self.sendButton=Tkinter.Button(self.frame[3],text=' 发 送 ',width=10,command=self.sendMessage)
self.sendButton.pack(expand=1,side=Tkinter.BOTTOM and Tkinter.RIGHT,padx=25,pady=5) #关闭按钮
self.closeButton=Tkinter.Button(self.frame[3],text=' 关 闭 ',width=10,command=self.close)
self.closeButton.pack(expand=1,side=Tkinter.RIGHT,padx=25,pady=5)
self.frame[3].pack(expand=1,fill=Tkinter.BOTH) #接收消息
def receiveMessage(self):
#建立Socket连接
self.serverSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.serverSock.bind((self.local,self.port))
self.serverSock.listen(15)
self.buffer = 1024
self.chatText.insert(Tkinter.END,'服务器已经就绪......')
#循环接受客户端的连接请求
while True:
self.connection,self.address = self.serverSock.accept()
self.flag = True
while True:
#接收客户端发送的消息
self.cientMsg = self.connection.recv(self.buffer)
if not self.cientMsg:
continue
elif self.cientMsg == 'Y':
self.chatText.insert(Tkinter.END,'服务器端已经与客户端建立连接......')
self.connection.send('Y')
elif self.cientMsg == 'N':
self.chatText.insert(Tkinter.END,'服务器端与客户端建立连接失败......')
self.connection.send('N')
else:
theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.chatText.insert(Tkinter.END, '客户端 ' + theTime +' 说:\n')
self.chatText.insert(Tkinter.END, ' ' + self.cientMsg) #发送消息
def sendMessage(self):
#得到用户在Text中输入的消息
message = self.inputText.get('1.0',Tkinter.END)
#格式化当前的时间
theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.chatText.insert(Tkinter.END, '服务器 ' + theTime +' 说:\n')
self.chatText.insert(Tkinter.END,' ' + message + '\n')
if self.flag == True:
#将消息发送到客户端
self.connection.send(message)
else:
#Socket连接没有建立,提示用户
self.chatText.insert(Tkinter.END,'您还未与客户端建立连接,客户端无法收到您的消息\n')
#清空用户在Text中输入的消息
self.inputText.delete(0.0,message.__len__()-1.0) #关闭消息窗口并退出
def close(self):
sys.exit() #启动线程接收客户端的消息
def startNewThread(self):
#启动一个新线程来接收客户端的消息
#thread.start_new_thread(function,args[,kwargs])函数原型,
#其中function参数是将要调用的线程函数,args是传递给线程函数的参数,它必须是个元组类型,而kwargs是可选的参数
#receiveMessage函数不需要参数,就传一个空元组
thread.start_new_thread(self.receiveMessage,()) def main():
server = ServerUI()
server.startNewThread()
server.root.mainloop() if __name__=='__main__':
main()
下面是客户端代码:
# _*_ coding:utf-8 _*_
# Filename:ClientUI.py
# Python在线聊天客户端 import Tkinter
import tkFont
import socket
import thread
import time
import sys class ClientUI(): title = 'Python在线聊天-客户端V1.0'
local = '127.0.0.1'
port = 8808
global clientSock;
flag = False #初始化类的相关属性,类似于Java的构造方法
def __init__(self):
self.root = Tkinter.Tk()
self.root.title(self.title) #窗口面板,用4个面板布局
self.frame = [Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame()] #显示消息Text右边的滚动条
self.chatTextScrollBar = Tkinter.Scrollbar(self.frame[0])
self.chatTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y) #显示消息Text,并绑定上面的滚动条
ft = tkFont.Font(family='Fixdsys',size=11)
self.chatText = Tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)
self.chatText['yscrollcommand'] = self.chatTextScrollBar.set
self.chatText.pack(expand=1,fill=Tkinter.BOTH)
self.chatTextScrollBar['command'] = self.chatText.yview()
self.frame[0].pack(expand=1,fill=Tkinter.BOTH) #标签,分开消息显示Text和消息输入Text
label = Tkinter.Label(self.frame[1],height=2)
label.pack(fill=Tkinter.BOTH)
self.frame[1].pack(expand=1,fill=Tkinter.BOTH) #输入消息Text的滚动条
self.inputTextScrollBar = Tkinter.Scrollbar(self.frame[2])
self.inputTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y) #输入消息Text,并与滚动条绑定
ft = tkFont.Font(family='Fixdsys',size=11)
self.inputText = Tkinter.Text(self.frame[2],width=70,height=8,font=ft)
self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
self.inputText.pack(expand=1,fill=Tkinter.BOTH)
self.inputTextScrollBar['command'] = self.chatText.yview()
self.frame[2].pack(expand=1,fill=Tkinter.BOTH) #发送消息按钮
self.sendButton=Tkinter.Button(self.frame[3],text=' 发 送 ',width=10,command=self.sendMessage)
self.sendButton.pack(expand=1,side=Tkinter.BOTTOM and Tkinter.RIGHT,padx=15,pady=8) #关闭按钮
self.closeButton=Tkinter.Button(self.frame[3],text=' 关 闭 ',width=10,command=self.close)
self.closeButton.pack(expand=1,side=Tkinter.RIGHT,padx=15,pady=8)
self.frame[3].pack(expand=1,fill=Tkinter.BOTH) #接收消息
def receiveMessage(self):
try:
#建立Socket连接
self.clientSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.clientSock.connect((self.local, self.port))
self.flag = True
except:
self.flag = False
self.chatText.insert(Tkinter.END,'您还未与服务器端建立连接,请检查服务器端是否已经启动')
return self.buffer = 1024
self.clientSock.send('Y')
while True:
try:
if self.flag == True:
#连接建立,接收服务器端消息
self.serverMsg = self.clientSock.recv(self.buffer)
if self.serverMsg == 'Y':
self.chatText.insert(Tkinter.END,'客户端已经与服务器端建立连接......')
elif self.serverMsg == 'N':
self.chatText.insert(Tkinter.END,'客户端与服务器端建立连接失败......')
elif not self.serverMsg:
continue
else:
theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.chatText.insert(Tkinter.END, '服务器端 ' + theTime +' 说:\n')
self.chatText.insert(Tkinter.END, ' ' + self.serverMsg)
else:
break
except EOFError, msg:
raise msg
self.clientSock.close()
break #发送消息
def sendMessage(self):
#得到用户在Text中输入的消息
message = self.inputText.get('1.0',Tkinter.END)
#格式化当前的时间
theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.chatText.insert(Tkinter.END, '客户端器 ' + theTime +' 说:\n')
self.chatText.insert(Tkinter.END,' ' + message + '\n')
if self.flag == True:
#将消息发送到服务器端
self.clientSock.send(message);
else:
#Socket连接没有建立,提示用户
self.chatText.insert(Tkinter.END,'您还未与服务器端建立连接,服务器端无法收到您的消息\n')
#清空用户在Text中输入的消息
self.inputText.delete(0.0,message.__len__()-1.0) #关闭消息窗口并退出
def close(self):
sys.exit() #启动线程接收服务器端的消息
def startNewThread(self):
#启动一个新线程来接收服务器端的消息
#thread.start_new_thread(function,args[,kwargs])函数原型,
#其中function参数是将要调用的线程函数,args是传递给线程函数的参数,它必须是个元组类型,而kwargs是可选的参数
#receiveMessage函数不需要参数,就传一个空元组
thread.start_new_thread(self.receiveMessage,()) def main():
client = ClientUI()
client.startNewThread()
client.root.mainloop() if __name__=='__main__':
main()
Python在线聊天软件(Tkinter)的更多相关文章
- Go语言实践_实现一(服务器端)对多(客户端)在线聊天室
一.目的 运用Go语言中的goroutine和通道实现一个简单的一个服务器端对多个客户端的在线聊天 软件环境:Goland,Go1.9 代码仓库链接 二.设计思路 与一对一的设计思路类似,就是加了个线 ...
- python练习四—简单的聊天软件
python最强大的是什么?库支持!!有了强大的库支持,一个简单的聊天软件实现就更简单了,本项目思路如下 # 项目思路 1. 服务器的工作 * 初始化服务器 * 新建一个聊天房间 * 维护一个已链接用 ...
- 【Python网络编程】多线程聊天软件程序
课程设计的时候制作的多线程聊天软件程序 基于python3.4.3 import socket import pickle import threading import tkinter import ...
- Python进阶开发之网络编程,socket实现在线聊天机器人
系列文章 √第一章 元类编程,已完成 ; √第二章 网络编程,已完成 ; 本文目录 什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战 ...
- 43.QQ聊天软件GUI窗口编写
QQ聊天软件代码功能编写 一,Tkinter聊天界面编写 1,聊天软件客户端界面开发-1 Tkinter的模块(“TK接口”)是标准的Python接口从Tk的GUI工具包 https://i.cnbl ...
- 基于Server-Sent Event的简单在线聊天室
Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...
- 调研一类软件的发展演变—聊天软件( 1000-2000 words, in Chinese)
因为本人平时对聊天软件的涉及比周边其他同学而言所涉及的是比较多的.所以说想写写这个东西.(ps本文里面的具体通讯信息的时间安排不分先后) 也许最起初的通讯信息的传达是利用.烽火狼烟这一类可以远距离视觉 ...
- 局域网聊天软件(winsocket)
LANChat工作整理 2013/8/22 程序实现功能: 局域网聊天软件,启动即可找到在线设备,并能够进行简单的文字聊天. 其实下面这个框图已经说明了程序的绝大部分功能原理. 核心类的程序框图 我觉 ...
- 白月黑羽Python在线教程
推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程,帮助大家迅速掌握程序开发技能. http://www.python3.vip/doc/tutorial/p ...
随机推荐
- SQL Server日志过大,清理日志
直接执行下面的代码 USE [master] GO ALTER DATABASE 数据库 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 数据库 ...
- layui(二)——layer组件常见用法总结
layer是layui的代表作,功能十分强大,为方便以后快速配置这里对其常见用法做了简单总结 一.常用调用方式 //1.普通消息:alert(content,[options],[yesCallBac ...
- jQuery克隆html元素并改变id
如题,前端操作经常需要ajax异步刷新html页面数据.有时候js里面拼接html代码很麻烦. 因此选择一个div克隆并改变一些值就省了很多事.这个div也可以提前写在html里面hide() 下面是 ...
- C# "XXX.XmlSerializers”的程序集未能加载到..
解决办法,进入Debug目录, 1.如果X86平台 sgen xxx.exe /c:"/platform:x86" 2.不考虑平台 sgen xxx.exe 3.生成前事件命令行, ...
- 为数据库重新生成log文件
1.新建一个同名的数据库 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文件覆盖掉这个新建的数据库 4.再重启sql server 5.此时打开企业管理器时会出现置疑,先不 ...
- HTTP 返回状态码
一.HTTP 超文本传输协议 HTTP 是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议. 一个HTTP "客户端"是一个应用程 ...
- 三层结构与MVC
实验室学弟突然又谈到了三层结构与MVC的话题,想想还是有必要整理一下这些个基本概念,且也纠正自己之前对二者的概念混淆,乃至将其错误思想指导于开发中. 关键词:三层结构(三层架构).MVC框架(思想). ...
- MySql数据库学习笔记(1)
MySql数据库 下载地址 https://dev.mysql.com/downloads/mysql/5.1.html#downloads 连接到本机上的MYSQL mysql -u root -p ...
- springboot-全局异常处理类
@ControllerAdvice public class GlobalExceptionHandler(){ @ExceptionHandler(value=Exception.class) @R ...
- day 10 - 2 函数练习
1.写函数 接收 n 个数字 求这些参数数字的和 def sum_func(*args): total = 0 for i in args: total += i return total prin ...