두 개의 클래스가 있는데, 하나는 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()
무엇이 당신 질문입니까? – Blubber
이 딜레마를 어떻게 해결할 수 있습니까? 다른 사람들이 내 글을 수정할 수 있습니까? 이후 (__) init (__)을 쓰지 않았기 때문에 init : O – KnasScripter
을 작성했습니다. 분명히 오류가 발생했습니다. 해결 될 것입니다. 작동하지 않는 해결 방법을 제시했습니다. – KnasScripter