2013-03-29 164 views
0

我正在嘗試在python中創建一個簡單的「聊天」客戶端。我有基本的知識和一切,但我無法讓我的線程工作。這仍然是一個正在進行的工作,所以並不是所有的代碼都在那裏,我知道,但如果你有任何建議作爲一個整體,將不勝感激。無法啓動Python線程循環

from Tkinter import * 
import time 
import socket 
import thread 
import threading 

HOST = 'localhost' 
PORT = 5454 
fromserver = '' 
data = '' 



#Declares socket information 
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

s.bind((HOST,PORT)) 


#Loop for receiving 
def receivingloop(): 
    global fromserver 
    while 1: 
     fromserver = s.recv(30) 
     time.sleep(.5) 


class ChatClient: 
    def __init__(self, master): 

     #Use Global fromserver 
     global fromserver 
     global data 
     #Create both frames   
     top_frame = Frame(master) 
     bot_frame = Frame(master) 
     #Create and pack the Buttons 
     self.send_but = Button(bot_frame, \ 
           text='Send',\ 
           command=self.sending) 
     self.quit_but = Button(bot_frame, \ 
           text='Quit', \ 
           command=client_window.destroy)   
     self.send_but.pack(side=LEFT) 
     self.quit_but.pack(side=LEFT) 




     #Create and pack label 
     self.received_lab = Label(top_frame,\ 
            text=(fromserver))   

     self.received_lab.pack() 

     self.sent_lab = Label(top_frame,\ 
           text='Message Sent: ' +data) 

     self.sent_lab.pack() 

     self.sending_entry = Entry(top_frame, \ 
            width=10) 


     self.sending_entry.pack() 

     #Pack Frames 
     top_frame.pack() 
     bot_frame.pack() 


    #Function to send stuff   
    def sending(self): 
     global data 
     s.sendto(data,(HOST,PORT)) 
     data = str(self.sending_entry.get()) 
     print data 


#Start the thread  
l1 = threading.Thread(target=receivingloop) 
l1.start() 


client_window = Tk() 
chat_client = ChatClient(client_window)   
client_window.mainloop() 
+0

你會得到什麼錯誤? –

回答

1

如果我沒有記錯的話,我會說的receivingloop方法需要你只能通過類需要自我元素,但自參數,這種方法是不是一類

試試這個:

#Loop for receiving 
def receivingloop(): 
    global fromserver 
    while 1: 
     fromserver = s.recv(30) 
     time.sleep(.5) 
+0

此外,建議使用隊列將數據傳遞給Tkinter的GUI線程:http://effbot.org/zone/tkinter-threads.htm –

+0

它現在無誤地運行錯誤,但它不更新標籤。我知道服務器可以工作,因爲我的其他CLI接收到消息並可以打印它。 – ddaniels

0

你的函數是用一個名爲'self'的變量來定義的,它看起來像你之前在一個類中有這個函數,但是後來決定從類中提取它。

總之,要解決您的問題,它應該僅僅是:

高清receivingloop():

注意「自我」的一部分從功能參數已被刪除。

此外,您可能需要將global data添加到您的發送功能。

+0

我刪除了自我參數,並添加了全局數據。我現在可以發送字符串,但我仍然無法接收它們。 編輯代碼以反映這一點。 – ddaniels

+0

我不認爲有一種功能可以在你發送數據後更新你的標籤。 另外,我猜(我不太瞭解Tkinter)你的標籤不是動態的,意思是一次它已初始化,如果更改變量的內容,則標籤將不會更新其最新內容。你必須自己做。 您可能想在發送一些數據後更新標籤的文本。要麼創建一個信號來更新,要麼在GUI上調用一個函數。您可以使用時鐘來定期更新標籤以將標籤更改爲最後收到的一段數據。 –