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()  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM