zoukankan      html  css  js  c++  java
  • 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 +' 说:
    ')  
                        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 +' 说:
    ')  
            self.chatText.insert(Tkinter.END,'  ' + message + '
    ')  
            if self.flag == True:  
                #将消息发送到客户端  
                self.connection.send(message)  
            else:  
                #Socket连接没有建立,提示用户  
                self.chatText.insert(Tkinter.END,'您还未与客户端建立连接,客户端无法收到您的消息
    ')  
            #清空用户在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 +' 说:
    ')  
                            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 +' 说:
    ')  
            self.chatText.insert(Tkinter.END,'  ' + message + '
    ')  
            if self.flag == True:  
                #将消息发送到服务器端  
                self.clientSock.send(message);  
            else:  
                #Socket连接没有建立,提示用户  
                self.chatText.insert(Tkinter.END,'您还未与服务器端建立连接,服务器端无法收到您的消息
    ')  
            #清空用户在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()  
    生命不止,奋斗不息
  • 相关阅读:
    [luoguP2486] [SDOI2011]染色(树链剖分)
    [POJ3162]Walking Race(DP + 单调队列)
    [HDU3586]Information Disturbing(DP + 二分)
    [luoguP1280] 尼克的任务(DP)
    [luoguP1282] 多米诺骨牌(DP + 背包)
    AOJ 0558 Cheese【BFS】
    POJ 3009 Curling 2.0【带回溯DFS】
    AOJ 0033 Ball【DFS】
    AOJ 0118 Property Distribution【DFS】
    POJ 1979 Red and Black【DFS】
  • 原文地址:https://www.cnblogs.com/shione/p/7274723.html
Copyright © 2011-2022 走看看