Python leave()はちょうど1つの引数をとります(与えられた0)

私のクラスのメソッドを外部(トップレベル)から呼び出すとき、それは自分のクラスの値を必要とする引数であるかのようにselfパラメータをとります:

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()))

Clientクラスを呼び出す私のtkinterボタンと、leave()メソッドを呼び出すボタン:

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 
b2 = Button(root, text="Leave", width=8, state=DISABLED, command=Client.leave)
TypeError: leave() takes exactly 1 argument (0 given)
0
Client.leave Client()。leave に置き換えたときに表示されるエラーを表示できますか?私はそれがあなたに縛られた方法を与え、したがって働くべきだと信じます...
追加された 著者 unutbu,
そこにはインデントがあります。 'クラスクライアント:'の後、ちょうどあなたが知っている。
追加された 著者 KnasScripter,
あなたは絶対に正しいです、それで私の問題は次のようになります: '' 'b2 = Button(root、text = "Leave"、width = 8、state = DISABLED、command = Client()leave) 'は、起動時にClientクラスを呼び出します.Clientクラスは、接続ボタンのみをクリックしたときに呼び出されるはずのクラスではありません。
追加された 著者 KnasScripter,

1 答え

クライアントインスタンスは、ユーザーが "Connect"ボタンを押したときに作成されるはずなので、 self.client = Client() GUI.connect >。

次に、コールされたときに self.client.leave()にデリゲートする2番目のメソッド 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()
3
追加された
あなたはPython3を使用しています。 Python3では、バインドされていないメソッドの概念が削除されています。回答を編集中...
追加された 著者 unutbu,
右。 Client.leave は、 Client .__ init __(...)を呼び出します。代わりに command = self.leave command = self.connect を使用してみてください。
追加された 著者 unutbu,
さて、 GUI Client から可能な限り分離しようとします。 (同じ Client の上に別のGUIを構築する場合は、 Client GUI に依存させないでください。ある日。)。ですから、 b1 b2 Client から移動して GUI に戻します。私は上記のコードを編集して、私が意味することを示しています。
追加された 著者 unutbu,
それは非常に真実ですが、私はClient()を使って試しましたが、残しておけば同じエラーが発生します:
追加された 著者 KnasScripter,
何らかの理由でsetup_buttons()を呼び出すGUI()を起動すると、command = Client()。leaveをcommand = Client.leaveに変更すると、クラスClient()が呼び出されます。 。
追加された 著者 KnasScripter,
もう一度おねがいしますが、b2はグローバル変数ではありません。つまり、Client .__ init __()で呼び出したときに認識されません。私はあなたがこれを簡単に解決することができることを知っています。それは、グローバルなb2または類似のものを設定することですが、それは私がやりたいことではありません。
追加された 著者 KnasScripter,