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()))
还有我用tkinter创建的按钮,一个是调用Client类的,另一个是调用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 <module>
b2 = Button(root, text="Leave", width=8, state=DISABLED, command=Client.leave)
TypeError: leave() takes exactly 1 argument (0 given)
1 个回答
3
当用户点击“连接”按钮时,应该创建一个客户端实例。我们可以让这个按钮调用一个方法 GUI.connect
,这个方法会创建 self.client=Client()
。
接下来,我们需要一个第二个方法 GUI.leave
,当这个方法被调用时,它会执行 self.client.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()