2013-03-29 64 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上调用一个函数。您可以使用时钟来定期更新标签以将标签更改为最后收到的一段数据。 –