1

私は何を間違っていますか?「refreshB」ボタンで「update」定義を呼び出したいのですが、代わりに nameError が発生します

class monitor():
    def update(self):
        print "Called"

    mon = Tk()
    mainFrame = Frame(mon)
    mainFrame.grid(row=1, column=1)

    optionFrame = Frame(mainFrame)
    optionFrame.grid(row=1, column=1)

    refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update('self') )
    refreshB.grid(row=1, column=1)

    mon.mainloop()

monitor()


**NameError: global name 'update' is not defined**

私はクラスにあまり詳しくありません。他に追加すべきものはありますか?

上記のスクリプトがクラスでない場合は、次を使用します。

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update )

どちらがうまくいくでしょうか...

4

2 に答える 2

1

すべての初期化コードを初期化関数内に配置します。次に を参照しupdate()てくださいself.update()

    class Monitor(object):
        def update(self, event):
            print "Called"

        def __init__(self):
            self.mon = Tk()
            self.mainFrame = Frame(self.mon)
            self.mainFrame.grid(row=1, column=1)

            self.optionFrame = Frame(self.mainFrame)
            self.optionFrame.grid(row=1, column=1)

            self.refreshB = ttk.Button(self.optionFrame, text='Refresh', command=self.update)
            self.refreshB.grid(row=1, column=1)

        def run(self):
            self.mon.mainloop()

    monitor = Monitor()
    monitor.run()

クラスメソッドではなくインスタンスメソッドであるため、update()参照はここでは機能しません。ラムダを使用しているからではありませんが、とにかくラムダ関数を使用する必要がある理由はわかりません。私の解決策には、 のインスタンスを作成することが含まれますMonitor。これは、内部のコードがいつ実行されるかを制御できるため便利ですMonitor。(それ以外の場合、クラス本体のコードは定義時に実行されます。呼び出しmonitor()はクラスのインスタンスを返すmonitorだけで、コードの本体は実行しません)

于 2012-04-30T21:07:25.880 に答える
0

クラスに直接副作用があるコードを実際に持つべきではありません。ほとんどの場合、オブジェクトが作成され__init__た後に呼び出される代わりに、すべてのコードを関数に含める必要があります。monitor

def __init__(self):
    mon = Tk()
    etc...

次に、updateインスタンス メソッドなので、オブジェクトに対して呼び出す必要があります。おそらくこれが必要です:

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: self.update('self') )

しかし、あなたのupdateメソッドは暗黙の引数を超えて引数を取らないのでself、実際にはこれが必要になるでしょう:

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: self.update() )

最後に、これlambdaは役に立たない間接的です。メソッドを でラップするのではなく、コールバックとして直接指定しないのはなぜlambdaですか?

refreshB = ttk.Button(optionFrame, text='Refresh', command=self.update )
于 2012-04-30T21:09:58.740 に答える