2011-12-18 3 views
0

좋아, 내 문제는 내 클래스의 내부 (최상위 레벨)에서 메서드를 호출 할 때 self 매개 변수를 인수로 사용할 때와 같은 것이다. 내 클래스의 값을 원하는 :파이썬 leave()는 정확히 1 인수 (0이 주어진다)

b2 = Button(root, text="Leave", width=8, state=DISABLED, command=Client.leave) 
b2.grid(row=0, column=3) 
Button(root, text="Connect", width=8, command=Client).grid(row=0, column=4) 

그리고 오류 :

Traceback (most recent call last): 
File "C:\Python32\chatClient2.py", line 68, in <module> 
b2 = Button(root, text="Leave", width=8, state=DISABLED, command=Client.leave) 
TypeError: leave() takes exactly 1 argument (0 given) 
012,351,641 방법 휴가()를 호출하는 클라이언트 클래스 하나를 호출
class Client: 
    def __init__(self, host='localhost', port=5000): 
     try: 
      self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      self.server_socket.connect((host, port)) 
      info.set("Connected...") 
      self.boool = True 
      self.gotten = "" 
      self.data = "" 
      b1.config(state=NORMAL) 
      b2.config(state=NORMAL) 
      textEntry.config(state=NORMAL) 
      time.sleep(1) 
      threading.Timer(1.0, self.listen).start() 
     except socket.error as error: 
      self.boool = False 
      info.set(str(error)[14:]) 
     except: 
      self.boool = False 
      info.set("An unknown error occured") 


    def leave(self): 
     self.boool = False 
     self.server_socket.close() 
     b1.config(state=DISABLED) 
     b2.config(state=DISABLED) 
     textEntry.config(state=DISABLED) 

    def listen(self):  
     while self.boool == True: 
      time.sleep(0.1) 
      self.data = self.server_socket.recv(512) 
      if self.data == bytes('quit', 'UTF-8'): 
       self.leave() 
       print("Server has left the chat") 
      elif self.data != self.gotten: 
       v.set("Server: %s\n%s" % (self.data, v.get())) 
       self.gotten = self.data 


    def send(self, message=''): 
     self.data.send(bytes(message, 'UTF-8')) 
     v.set("Client: %s\n%s" % (message, v.get())) 

그리고 내 Tkinter를 버튼
+0

. '클래스 클라이언트 :'이후, 그냥 알 수 있습니다. – KnasScripter

+0

'Client.leave'를'Client(). leave'로 대체 할 때 나타나는 에러를 보여줄 수 있습니까? 나는 당신에게 바운드 방법을 제공해야하고 그러므로 일해야한다고 믿는다. – unutbu

+0

당신은 절대적으로 옳다. 이제는 내 문제가 될 것이다. '' 'b2 = Button (root, text = "Leave", width = 8, state = DISABLED, command = Client(). leave) '' '시작시 Client 클래스를 호출합니다.이 클래스는 연결 버튼 만 클릭했을 때 클래스가 호출되도록되어 있지 않습니다. – KnasScripter

답변

3

클라이언트 인스턴스는 사용자가 "연결"버튼을 누를 때 만들어지기 때문에 GUI.connect이라는 메쏘드를 호출하면 self.client=Client()이 생성됩니다.

그런 다음 self.client.leave()에라는 두 번째 방법 GUI.leave, 위임을 사용 :이 들여 쓰기

class GUI(): 
    def __init__(self): 
     self.client = None 
    def setup_buttons(self): 
     self.b1 = ... 
     self.b2 = Button(root, text = "Leave", width = 8, state = DISABLED, command = self.leave) 
     b2.grid(row = 0, column = 3) 
     Button(root, text = "Connect", width = 8, command = self.connect).grid(row = 0, column = 4) 
    def connect(self): 
     self.b1.config(state = NORMAL) 
     self.b2.config(state = NORMAL) 
     self.client = Client() 
    def leave(self): 
     if self.client: 
      self.b1.config(state = DISABLED) 
      self.b2.config(state = DISABLED) 
      self.client.leave() 
+0

Client()를 사용하여 tryed 했는데도 매우 그렇습니다. 떠나서 같은 오류가 발생합니다 : ( – KnasScripter

+0

) 죄송합니다 .. Python3을 사용하고 있습니다. 언 바운드 메서드의 개념이 Python3에서 삭제되었습니다. .. – unutbu

+0

GUI()를 시작하여 setup_buttons()를 호출하면 어떤 이유로 Client() 클래스는 command = Client(). leave를 명령 = Client.leave로 변경할 때 호출됩니다. it – KnasScripter

관련 문제