0

ユーザー名とパスワードを取得してリモートサーバーに接続し、機能を実行するTkinterを使用してGUIを作成しようとしています。いくつかの乱雑なコードをまとめて、多かれ少なかれ機能しましたが、きちんとしたモジュールで再作成しようとすると、壊れました。おそらく初心者のpythonエラーですが、私はそれを見つけることができません。編集:明確にするために、それが機能したとき、唯一のクラスはsetupGuiであり、すべてのメソッドはそのクラスの下にありました。GUIをメソッドから分離したので、機能しません。

class setupGui(object):
   def __init__(self, parent):
      ##omited general frame stuff 

       self.userIn = ttk.Entry(self.topFrame, width = 20)
       self.userIn.grid(row = 1, column = 1)
       self.passIn = ttk.Entry(self.topFrame, width = 20, show ="*")
       self.passIn.grid(row = 2, column = 1)

       #Buttons
       self.setupbtn = ttk.Button(self.topFrame, text = "Start Setup", command = setup().startSetup())
       self.setupbtn.grid(row = 3, column = 0, pady = 10)

class setup(object):
   def__init__(self):
      self.userName = setupGui.userIn.get()
      self.userPass = setupGui.passIn.get()
   def startSetup(self):
      self.another_related_fucntion # about 4 related functions actually

if __name__ == '__main__':
root = Tk()
gui = setupGui(root)
root.mainloop()

そして、ボタンにコマンドが添付されていない場合、すべてが正常に機能します(ただし、見栄えが悪いことを除いて、明らかにしゃがみます)。コマンドを添付すると、次のエラーが発生します。

Traceback (most recent call last):
 File "macSetup.py", line 211, in <module>
 gui = setupGui(root)
 File "macSetup.py", line 45, in __init__
self.setupbtn = ttk.Button(self.topFrame, text = "Start Setup", command = setup().startSetup())
File "macSetup.py", line 69, in __init__
self.userName = setupGui.userIn.get()
AttributeError: type object 'setupGui' has no attribute 'userIn'
4

3 に答える 3

1

属性は関数へのcommand参照を取りますが、関数を呼び出して結果をcommand属性に渡しています。最終的な結果として、ボタンをクリックしたときではなく、ボタンを作成したときに setup 関数を呼び出すことになります。まだ完全に初期化されていないため、エラーが発生します。

あなたはこれをやっています:

self.setupbtn = ttk.Button(self.topFrame, text = "Start Setup", command = setup().startSetup()) 

...次のようなことをする必要がある場合:

self.setupbtn = ttk.Button(self.topFrame, text = "Start Setup", command = setup().startSetup) 

末尾の()onがないことに注意してくださいstartSetup

setupボタンがクリックされるまでインスタンス化したくない場合は、いくつかの選択肢があります。間違いなく、メソッドを作成するのが最善です。

def _launch_setup(self):
    setup().setupGui()
...
self.setupbtn = ttk.Button(..., command=self._launch_setup)

ラムダを使用することもできますが、この場合は名前付きメソッドをお勧めします。

于 2012-05-18T20:38:28.627 に答える
1

あなたのコードでは、クラス自体の属性としてではなく、オブジェクトuserInのインスタンス変数として設定されています。setupGuisetupGui

setupGui最も簡単な解決策は、とsetupクラスをマージしstartSetupて のメソッドとして移動し、初期化時にsetupGui使用することです。これはバインドされたメソッドとして呼び出されるため、オブジェクトを参照する必要があります。command=self.startSetupsetupbtnstartSetupselfsetupGuiself.userIn.get()self.passIn.get()

setupクラス内にあるロジックをクラス外に保持したい場合は、次のsetupGuiように分離できます。

class setup(object):
    def __init__(self, username, userpass):
        self.userName = username
        self.userPass = userpass

    def startSetup(self):
        # as before

setupGui次に、このメソッドをクラスに追加します。

def dosetup(self):
    setup(self.userIn.get(), self.passIn.get()).startSetup()

でインスタンス化Buttoncommand=self.dosetupます。(私は個人的にsetupクラスをスタンドアロン関数にしますが、ルーチンが実際にどれほど複雑かはわかりませんstartSetup。そのため、クラスにする正当な理由があると思います。)

于 2012-05-18T19:14:09.563 に答える
0

クラスsetupGui自体には属性がありませんuserIn

あなたの__init__方法では、クラスではなくインスタンスsetupGuiに属性を与えます。

于 2012-05-18T19:11:19.200 に答える