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()  
时间: 2024-10-11 02:13:32

Python在线聊天软件(Tkinter)的相关文章

python练习四—简单的聊天软件

python最强大的是什么?库支持!!有了强大的库支持,一个简单的聊天软件实现就更简单了,本项目思路如下 # 项目思路 1. 服务器的工作 * 初始化服务器 * 新建一个聊天房间 * 维护一个已链接用户的会话列表 * 维护一个已登录用户的字典,用户名和会话 * 监听端口,接受会话,并启动一个ChatSession处理 2. 会话线程 * 初始化一个接收数据缓冲区 * 处理用户输入的命令,并提醒用户先登录(也就是说目前指处理登陆命令) * 将用户输入的数据加入缓冲区 * 用户一次输入结束后,将缓冲

Python开发双工聊天软件

需求: 1.用Socket开发双工聊天软件,服务端与客户端交互 2.聊天记录要记录到MySQL数据库 3.客户端可以查看聊天记录 4.用三层架构开发 程序架构 各文件作用解析 - model              model层 - dialogue.py        dialoue表 - users.py          users表 - utility             公共层 - sql_helper.py       公共配置文件 - client.py         客户

【Python网络编程】多线程聊天软件程序

课程设计的时候制作的多线程聊天软件程序 基于python3.4.3 import socket import pickle import threading import tkinter import os import datetime import time try: import pymysql except: print("can't find pymysql") tcplocalport=8101 #TCP监听端口 tcpconnectport=8101 #TCP连接端口 u

Python进阶开发之网络编程,socket实现在线聊天机器人

系列文章 √第一章 元类编程,已完成 ; √第二章 网络编程,已完成 ; 本文目录 什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战:搭建在线聊天机器人 . 什么是socket? 说到网络编程,难免要提到socket? 那什么是socket呢,中文名叫"套接字",更难理解了吧. 通俗来讲,socket表示一个网络连接,通过这个连接,使得主机间或者一台计算机上的进程间可以通讯. 不管是不同主机,还是同一主机.既然是通信,

一个python程序——聊天

本文来自麦兜响当当的同名博文 这几天学了python的一点网络编程和Tkinter的GUI界面编程,今天大体用一下,编一个简单的双工的聊天软件,当然功能是再简单不过了,只是能 收发消息,显示消息而已,就当玩玩了,目前写了一点点代码,基本能实现收消息和显示收到的消息了,当然客户端的界面我也没有做,还是停留在Shell上收 发,服务器端界面做了,不过界面做的很丑,而且不能显示汉字(有待改进),服务器向客户端发也没做. 当然,这里面有很多问题的,目前来说有些我还解决不了.现在的程序中我只是用到了两个线

Textual是什么软件?Mac网络聊天软件Textual介绍

Textual是什么软件?textual是一款专为Mac用户设计的网络聊天客户端,其以独特的风格和强大的功能深受广大Mac用户的喜爱.Textual将最好的IRC集中到一个客户端上,支持脚本处理,所以无论是新手还是专家都可以很好的使用Textual进行RIC聊天.Textual for Mac软件特色1.美丽的界面Textual包括两个设计优雅的用户界面的暗色和浅色变体,这些变体一直被精炼到最后一个像素.2.强大Textual支持非常强大的现代技术,例如本机IPv6,最新的IRCv3规范,客户端

仿QQ聊天软件2.0版

仿QQ聊天软件2.0版 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907     上次课设做了Java版的仿QQ聊天程序,这次软件实训,我们继续完善了仿QQ聊天程序,将上次未完成及不完善的地方进行完善和改进,还新加了部分功能:表情输入.气泡模式.文件传输.截屏.语音聊天.逐步向QQ的基本功能靠齐.通过这次软件实训,又有了很多收获. 一.设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件,基本功能和QQ类似.首先,

调研一类软件的发展演变—聊天软件( 1000-2000 words, in Chinese)

因为本人平时对聊天软件的涉及比周边其他同学而言所涉及的是比较多的.所以说想写写这个东西.(ps本文里面的具体通讯信息的时间安排不分先后) 也许最起初的通讯信息的传达是利用.烽火狼烟这一类可以远距离视觉察到的事物来进行传播的吧.毕竟古人军队的战斗信息是靠着这个来传达的.古代也有着周幽王“烽火戏诸侯”的历史典故. 可能是因为古装电视剧看多了的原因.我觉得一开始的聊天软件应该起于飞鸽传书(此处不谈及那些神话里面的“仙人”的知微.观微吧0.0......). 飞鸽传书与“鸿雁传书”是一个意思,是古人之间

Java系列讲座二:Socket网络通信实现聊天软件项目讲解(UDP)

上一篇我们讲了通过TCP方式实现网络通信软件开发的原理,思路及实现,今天跟大家谈谈Socket通信中UDP方式通信的软件开发步骤及主要代码讲解,UDP实现方式实现的通信软件特点是不分客户端与服务器端,一个程序既是客户端与是服务器端,典型软件是一些局域网的聊天软件,如飞鸽等软件. UDP方式通信主要用到了java.net包中的3个类分别是DatagramPacket类,DatagramSocket类与InetAddress类,下面通过实现一个简易聊天软件小项目来讲解他们的使用方法,代码如下: pa