2011-12-20 1 views
-2

두 개의 클래스가 있는데, 하나는 GUI = GUI()을 처리하고 하나는 클라이언트 연결을 server = Client()으로 처리합니다. 그래서, 내 오류 보고서는 다음과 같습니다self를 인수로 사용하는 Python

TypeError: change_state() takes exactly 2 arguments (1 given) 

GUI()에서 change_state 내 자체 인수()을 가진 및 클라이언트에서 GUI.change_state ('NORMAL')를 호출().

그러나 self를 인수로 사용하지 않을 경우 change_state() 내에서 self를 사용하여 GUI 클래스 내에서 다른 함수를 호출 할 수 없습니다. 그리고 GUI.change_state()GUI().change_state 으로 변경하면 매번 GUI에 __init__ 메쏘드가 호출됩니다. 난 당신이 내가 코드 무엇을 의미하는지 조금의 이해를 바랍니다 :

#!/usr/bin/python 
import socket 
import time 
import tkinter 
import threading 
from tkinter import * 

root = Tk() 
root.geometry("363x200") 
root.resizable(0,0) 
root.title("Emsg") 
b1 = None 
b2 = None 
class Client: 
    def __init__(self, host='localhost', port=5000): 
##  global b1 
##  global b2 
##  global b3 
     try: 
      self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      self.server_socket.connect((host, port)) 
      time.sleep(0.5) 
      GUI.set_info("Connected...") 
      self.boool = True 
      self.gotten = "" 
      self.data = "" 
      GUI.change_state('NORMAL') <<<<<<<<< Problem 
      threading.Timer(1.0, self.listen).start() 
     except socket.error as error: 
      self.boool = False 
      GUI.set_info(str(error)[14:]) 
##  except: 
##   self.boool = False 
##   GUI.set_info("An unknown error occured") 


    def leave(self): 
     self.boool = False 
     self.server_socket.close() 
     GUI.change_state('DISABLED') 
     GUI.set_info("You have left the chat") 
     GUI.set_v("", "") 
     self.data = "" 

    def listen(self):  
     while self.boool: 
      try: 
       time.sleep(0.1) 
       self.data = self.server_socket.recv(512) 
       if self.data == bytes('quit', 'UTF-8'): 
        self.leave() 
        GUI.set_info("Server has left the chat") 
        GUI.set_v("", "") 
       elif self.data != self.gotten: 
        GUI.set_v("Server:", self.data, True) 
        self.gotten = self.data 
      except socket.error: 
       self.leave() 


    def send(self, message=''): 
     self.server_socket.send(bytes(message, 'UTF-8')) 
     GUI.set_v("Client:", message) 
     GUI.reset_cmsg() 


class GUI: 
    def __init__(self): 
     self.client = None 
     self.setup_buttons() 

    def setup_buttons(self): 
     global b1 
     global b2 
     global b3 
     b1 = Button(root, text="Send", width=8, state=DISABLED, command=self.send) 
     b1.grid(row=0, column=2) 
     b2 = Button(root, text="Leave", width=8, state=DISABLED, command=self.leave) 
     b2.grid(row=0, column=3) 
     b3 = Button(root, text = "Connect", width = 8, command = self.connect) 
     b3.grid(row = 0, column = 4) 

    def connect(self): 
     self.client = Client() 
     self.first = True 

    def leave(self): 
     if self.client: 
      self.client.leave() 

    def send(self): 
     if self.client: 
      self.client.send(textEntry.get()) 

    def set_v(name, value, encoding=False): 
     if encoding: 
      v.set("%s: %s\n%s" % (name, str(value, 'UTF-8'), v.get())) 
     else: 
      v.set("%s: %s\n%s" % (name, value, v.get())) 
     if name == "": 
      v.set("") 


    def change_state(self, _state): 
     global b1 
     global b2 
     global b3 
     if _state == 'DISABLED': 
      b1.config(state=DISABLED) 
      b2.config(state=DISABLED) 
      b3.config(command=self.connect) <<<<<<<< Problem if changedto GUI().connect 
      b3.config(text="Connect") 
      textEntry.config(state=DISABLED) 
     elif _state == 'NORMAL': 
      b1.config(state=NORMAL) 
      b2.config(state=NORMAL) 
      b3.config(command=self.leave) 
      b3.config(text="Disconnect") 
      textEntry.config(state=NORMAL) 

    def set_info(value): 
     info.set(value) 

    def reset_cmsg(): 
     c_msg.set("") 












v = StringVar() 
info = StringVar() 
c_msg = StringVar() 

Label(root, text="Enter: ").grid(row=0, column=0) 
textEntry = Entry(root, state=DISABLED, textvariable=c_msg) 
textEntry.grid(row=0, column=1) 
statusField = Label(root, textvariable=info, wraplength=200) 
statusField.grid(row=1, column=0, columnspan=5, sticky="w") 
msgField = Message(root, textvariable=v, width=330, fg="blue") 
msgField.grid(row=2, column=0, columnspan=5, sticky="w") 

GUI() 

root.mainloop() 
+0

무엇이 당신 질문입니까? – Blubber

+0

이 딜레마를 어떻게 해결할 수 있습니까? 다른 사람들이 내 글을 수정할 수 있습니까? 이후 (__) init (__)을 쓰지 않았기 때문에 init : O – KnasScripter

+0

을 작성했습니다. 분명히 오류가 발생했습니다. 해결 될 것입니다. 작동하지 않는 해결 방법을 제시했습니다. – KnasScripter

답변

2

귀하의 질문이 다소 모호,하지만 지금까지 내가 당신이 GUI 클래스에 change_state 클래스 메서드를 호출 말할 수 있습니다. 이렇게하면 GUI 개체를 인스턴스화해야 작동하고 그에 change_state 메소드를 호출하지 않습니다 : 그것은 클래스 메소드

했다으로

gui = GUI() 
gui.change_state('NORMAL') 
+0

아니요 Client 클래스에서 change_state 클래스 메소드를 호출하고 있습니다. GUI에서 메소드 연결을 살펴본 결과, self.client = Client()를 인스턴스화하고 있다고 가정 해 보았습니다. gui = GUI (최상위)에서 호출 한 다음 GUI에서 전역 적으로 호출? – KnasScripter

+0

GUI()를 gui = GUI()로 변경 한 다음 GUI.method()의 모든 메소드 호출을 gui.method()로 바꿔야합니다. 또한, bpgergo의 답변에있는 링크를 확인하십시오. – Blubber

+0

그게 내가 시도한거야, 그리고 그것은 밖으로, 고마워. 비록 내가 말하지 않았지만 : 글로벌 GUI는 GUI 클래스 내에서 최상위 변수를 호출 할 때 어쨌든 작동했다. 호기심에 불과합니다. :) – KnasScripter

0

당신이 (: http://docs.python.org/library/functions.html#classmethod를이 참조) change_state 함수를 호출을

그러나 그렇지 않다, 그것은 자기 참조하기 때문에 당신은 그렇게 할 수 없습니다

b3.config(command=self.connect) <<<<<<<< Problem if changedto GUI().connect 

그래서 당신은를 호출해야 인스턴스상의3210

gui = GUI() 
gui.change_state('DISABLED')