2013-03-29 3 views
0

파이썬에서 간단한 "채팅"클라이언트를 만들려고합니다. 나는 기초와 모든 것을 가지고있다. 그러나 나는 실을 꿰기를 전혀 할 수 없다. 이것은 아직 진행중인 작업이므로 모든 코드가 아직 존재하지는 않습니다. 그리고 제가 알기는하지만 전반적인 제안이 있으면 크게 감사 할 것입니다. 나는 내가 receivingloop 방법을 사용하여 클래스에 의해 만하면 자기 요소하지만 자기 인수를 말을 오해하지 않아요,이 방법은 클래스에없는 경우문제 해결 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

이 시도 :

#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

데이터를 보내면 라벨을 업데이트하는 기능이 없다고 생각합니다. 또한 Tiger의 라벨은 동적이지 않습니다. 즉, 한 번 의미하는 것입니다. 변수의 내용을 변경하면 라벨이 초기화되어 최신 내용으로 레이블이 업데이트되지 않습니다. 너 스스로 그렇게해야 해. 레이블의 텍스트를 일부 데이터로 보낸 후 업데이트하는 것이 좋습니다. 업데이트 할 신호를 만들거나 GUI에서 함수를 호출하십시오. 시계를 사용하여 주기적으로 레이블을 업데이트하여 레이블을 마지막으로받은 데이터 조각으로 변경할 수 있습니다. –