2011-12-20 63 views
-2

我有两个类,一个处理GUI = GUI(),一个处理客户端连接到我的server = Client()。所以,我的错误报告是:使用自己作为参数的Python

TypeError: change_state() takes exactly 2 arguments (1 given) 
有change_state内)的GUI()自参数(时,从客户端调用GUI.change_state( '正常')

()。

但是,如果在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 2011-12-20 16:50:11

+0

我该如何解决这个困境?顺便说一句,其他人可以编辑我的文章?因为我没有编写(__)init(__),所以我写了init:O – KnasScripter 2011-12-20 16:53:01

+0

显然我得到一个错误,那就要解决了。我提出了解决方法,但不起作用。 – KnasScripter 2011-12-20 16:54:30

回答

2

你的问题是相当模糊的,但据我可以告诉你正在呼吁GUI类change_state类方法。这将无法正常工作,你应该实例化一个GUI对象,然后调用该方法change_state:

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

不,我正在调用客户端类的change_state类方法,我已经完成了你说的如果你看看GUI上的连接方法我正在实例化self.client = Client(),你告诉我我应该调用gui = GUI()在顶层,然后在GUI中全局调用它? – KnasScripter 2011-12-20 17:04:46

+0

您应该将GUI()的那一行更改为gui = GUI(),然后将GUI.method()中的所有方法调用替换为gui.method()。另外,请检查bpgergo答案中的链接。 – Blubber 2011-12-20 17:06:41

+0

这就是我试过的,它确实解决了,谢谢。尽管我没有说全局gui,但是它在GUI类中调用顶级变量时无论如何都起作用。这只是一个好奇心问题.. :) – KnasScripter 2011-12-20 17:15:36

0

调用change_state功能,因为它是一个类的方法

(看到这一点:http://docs.python.org/library/functions.html#classmethod

但是它不是,你不能让它这样,因为它引用自:

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

所以你应该叫change_state上的一个实例

gui = GUI() 
gui.change_state('DISABLED') 
相关问题