5

Tkinter GUI を使用してマルチスレッドで簡単な関数を実行する必要があるため、mtTkinter を試しました。

特定の例外を除いて、すべて正常に動作します。GUI を起動しただけで、何にも触れずに閉じても、一部のスレッドが実行され続けます。

言い換えると; 私はこのコードを持っています:

from Tkinter import *
root = Tk()

#simple GUI code with buttons, labels, text and scrollbars widget
...
...    
root.mainloop()

このコードを実行すると GUI が表示され、閉じるとこの python スクリプトが正常に終了します。

Tkinter を mtTkinter に置き換えると

from mtTkinter import *
root = Tk()

#simple GUI code with buttons, labels, text and scrollbars widget
...
...    
root.mainloop()

GUI が再び表示されますが、閉じても mtTkinter からのスレッドがまだ実行されています。

事前に感謝し、私の下手な英語で申し訳ありません!

4

3 に答える 3

3

私のアプリケーションでも同様の問題が発生しました ( https://github.com/joecole889/spam-filter )。調査の結果、アプリケーションを閉じると、Tkinter (またはおそらく Matplotlib) が threading._DummyThread インスタンスを使用してウィジェットの 1 つを削除することがわかりました。アプリケーションの Tkinter キャンバス ウィジェットに Matplotlib グラフがあります。いずれにせよ、「画像の削除」イベントがイベント キューに追加され、mtTkinter が responseQueue で応答を待機するのをブロックしているように見えます。

threading._DummyThread のインスタンスからのイベントを mtTkinter のキュー インフラストラクチャを介さずに実行できるようにすることで、問題を解決できました。つまり、次のように変更しました。

if threading.currentThread() == self._tk._creationThread:

if (threading.currentThread() == self._tk._creationThread) or \
   isinstance(threading.currentThread(), threading._DummyThread) :

物事は今私のために働いているようです...これが役立つことを願っています!

于 2016-03-17T20:29:24.787 に答える
2

私はそれを使用しないことを「解決」しました。mTkinter は少しバグがあるようです。

于 2013-01-18T23:54:02.157 に答える
0

これは古いトピックですが、どこで閉鎖されたのかさえわかりません。「theading」モジュールと MtTkinter を使用して 4 つのスレッドを使用する Python アプリケーションがあります。

MtTkinter でも同様の問題がありました。アプリケーションは機能しましたが、閉じませんでした。私はかなりの数の解決策を検索して試しましたが、どれもうまくいきませんでした。私のアプリケーションでは、キューを使用するのは面倒でした。

これが私がしたことです。エレガントではありませんが、うまくいきました。そのかなり冷酷です。

cleanup():`
    pidx = os.getpid()
    cmd1 = "kill" + " " + str(pidx)
    if __name__ == "__main__":
        os.system(cmd1)
于 2016-05-09T19:22:44.203 に答える