質問

どのようにして別のオブジェクトからtkinter event を呼び出しますか?

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

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

役に立ちましたか?

解決

「別のオブジェクトから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)

他のヒント

ブライアンの上記の答えをよりよく理解するためのいくつかのドキュメントとリンクを以下に示します。

New Mexico Tech の機能の説明:

w.event_generate(sequence、** kw)

  

このメソッドは、外部刺激なしでイベントをトリガーします。イベントの処理は、外部刺激によってトリガーされた場合と同じです。シーケンス引数は、トリガーされるイベントを記述します。 keyword = value引数を指定することにより、Eventオブジェクトの選択されたフィールドの値を設定できます。キーワードはEventオブジェクトのフィールドの名前を指定します。

tcl / tkイベント属性のリストと説明こちら

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top