Tkinter回调中的奇怪异常
我正在做一个小项目,使用Tkinter创建一个简单的日志控制台,它可以把从串口接收到的文本打印到一个文本框里,并且加上一些颜色。
我有一个问题,可以在这里找到:Python Tkinter文本框的自动和自定义滚动
不过,即使没有手动滚动(我用 self.text.yview(END)
来在插入文本后自动滚动到底部,插入的文本是 self.text.insert(END, str(parsed_line))
),
这个脚本其实是能正常工作的,但偶尔会在Tkinter的线程中抛出一些“静默”的异常,这些异常不会导致整个应用崩溃:
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"
,这个字符串被传给了一个期待浮点数的方法,并且这个错误信息是拼接在一起的。这个字符串中的浮点数看起来像是我附加在文本框上的滚动条的位置:
(...)
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交互,所以这不可能是线程问题。
在我对 parsed_line
使用 str()
函数之前,我也遇到过非常随机的错误,那个时候我在 self.text.insert(END, str(parsed_line))
中没有使用这个函数。
这种行为很奇怪,我想知道有没有人能解释一下这是怎么回事,以及如何解决这个问题。
非常感谢!
1 个回答
mtTkinter 让你可以在使用 Tkinter 的时候进行多线程操作,你可以在这里找到它:
http://tkinter.unpythonic.net/wiki/mtTkinter
只需要把 mtTkinter 导入替代 Tkinter。这样,你就可以从多个线程同时往一个文本框里插入文字,而不会出现冲突。我在写一些即时通讯软件的时候用过它,效果非常好。