Странное исключение в обратном вызове Tkinter - PullRequest
3 голосов
/ 17 января 2012

Я все еще работаю над моим небольшим проектом 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, это не может быть проблемой с потоками.

Я также получил очень случайные ошибки, подобные этим, прежде чем я применил функцию str() к parsed_line в self.text.insert(END, str(parsed_line)).

Это очень странное поведение, и мне интересно, кто-нибудь может объяснить, что это такое и как это исправить.

Большое спасибо!

1 Ответ

2 голосов
/ 18 марта 2012

mtTkinter позволяет многопоточность с Tkinter, вы можете получить его здесь:

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

Просто импортируйте mtTkinter вместо Tkinter. Это позволит вам вставлять текст в виджет Текст из нескольких потоков без конфликтов. Я использовал его для некоторого программного обеспечения для обмена мгновенными сообщениями, которое я написал, и оно прекрасно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...