19

event別のオブジェクトから tkinter を呼び出すにはどうすればよいですか?

wxWidgets のようなものを探していwx.CallAfterます。たとえば、オブジェクトを作成し、それにTkルート インスタンスを渡し、オブジェクトからそのルート ウィンドウのメソッドを呼び出そうとすると、アプリがロックされます。

私が思いつく最善の方法は、afterメソッドを使用して別のオブジェクトからステータスを確認することですが、それは無駄に思えます。

4

2 に答える 2

37

「別のオブジェクトから TkInter イベントを呼び出す方法」という特定の質問に答えるには、event_generateコマンドを使用します。ルート ウィンドウのイベント キューにイベントを挿入できます。Tk の強力な仮想イベント メカニズムと組み合わせると、便利なメッセージ パッシング メカニズムになります。

例えば:

from tkinter import *

def doFoo(*args):
    print("Hello, world")

root = Tk()
root.bind("<<Foo>>", doFoo)

# some time later, inject the "<<Foo>>" virtual event at the
# tail of the event queue
root.event_generate("<<Foo>>", when="tail")

event_generateコールはすぐに返されることに注意してください。それがあなたが望むものかどうかは明らかではありません。一般的に言えば、イベント ベースのプログラムが特定のイベントへの応答を待機するのをブロックすることは望ましくありません。これは、GUI がフリーズするためです。

ただし、これで問題が解決するかどうかはわかりません。あなたのコードを見ないと、あなたの本当の問題が何であるかわかりません。たとえば、アプリがロックアップすることなく、ルートが渡されるオブジェクトのコンストラクターでルートのメソッドにアクセスできます。これは、コードで何か他のことが起こっていることを示しています。

他のオブジェクトからルート ウィンドウのメソッドに正常にアクセスする例を次に示します。

from tkinter import *

class myClass:
    def __init__(self, root):
        print("root background is %s" % root.cget("background"))

root = Tk()
newObj = myClass(root)
于 2008-11-09T16:26:28.640 に答える