2011-12-20 10 views
-2

私はGUI = GUI()を扱うクラスとクライアント接続を処理するクラスの2つのクラスを持っています。server = Client()です。だから、私のエラーレポートは次のようになります。selfを引数として使用するPython

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

GUI()内change_state内のself引数を()を有する、およびクライアントからGUI.change_state( 'NORMAL')を呼び出します()。

しかし、change_state()の中にselfを引数として持たない場合は、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

いいえクライアントクラスでchange_stateクラスメソッドを呼び出していますが、GUI上でメソッドconnectを見れば、私は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')