1. ホーム
  2. python

[解決済み] Tkinterのコールバックで奇妙な例外が発生する

2022-02-03 12:35:34

質問

私はまだ私の小さなTkinterプロジェクトに取り組んでいます。それは、シリアルラインからの受信テキストをテキストウィジェットに印刷し、いくつかの色付けを適用したシンプルなロギングコンソールです。

質問が一つ公開されていますので、こちらでご確認ください。 Python Tkinter Text Widget with Auto & Custom Scroll

しかし、手動スクロールがなくても(だから、私は self.text.yview(END) でテキストを挿入した後、一番下まで自動スクロールさせることができます。 self.text.insert(END, str(parsed_line)) .

スクリプトは実際に動作しますが、時々Tkinterスレッド内でいくつかの"silent"例外が発生し、アプリケーション全体をクラッシュさせることはありません。

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 2813, in set
    self.tk.call((self._w, 'set') + args)
TclError: expected floating-point number but got "0.7807017543859649integer but got "end""
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 2813, in set
    self.tk.call((self._w, 'set') + args)
TclError: invalid command name ".15427224integer but got "end""

まるで、あるメソッドが整数を期待し、文字列 integer but got "end" を、float を期待するメソッドに渡すと、エラーメッセージと一緒に連結されます。この文字列の中の浮動小数点数は、私がテキスト・ウィジェットに付けたスクロールバーの位置のようです。

(...)       
scrollbar = Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)
text = Text(wrap=WORD, yscrollcommand=scrollbar.set)
scrollbar.config(command=text.yview)
text.pack(expand=YES, fill=BOTH)
(...)

短時間にたくさんの行を挿入したときに起こるような気がしています。しかし、Tkinterとやりとりしているスレッドは1つだけなので、スレッドの問題であるはずがありません。

を適用する前にも、このようなエラーが非常にランダムに発生しました。 str() 関数を parsed_lineself.text.insert(END, str(parsed_line)) .

これは非常に奇妙な動作で、どなたかこれがどういうことで、どうすれば直るのかを説明していただけませんか。

ありがとうございました。

解決方法は?

mtTkinterはTkinterでマルチスレッドを可能にします。

http://tkinter.unpythonic.net/wiki/mtTkinter

Tkinterの代わりにmtTkinterをインポートするだけです。これにより、複数のスレッドからテキストウィジェットにテキストを挿入する際に、競合が発生しなくなります。私はこれを私が書いたインスタントメッセージングソフトウェアに使いましたが、素晴らしくうまくいきました。