Как мне отображать постоянно обновляемый таймер с помощью PyGTK?

Я пишу программу таймера на Python, используя PyGTK. Это с точностью до сотых. Прямо сейчас я использую постоянно обновляемый ярлык. Это проблема, потому что, если я изменяю размер окна во время работы таймера, Pango чаще всего выдает какую-то сумасшедшую ошибку, и моя программа завершается. Это не всегда одна и та же ошибка, но разные ошибки, которые, как я предполагаю, являются какой-то формой неудачного розыгрыша. Кроме того, метка обновляется все медленнее и медленнее по мере увеличения размера шрифта.

Итак, мне интересно, есть ли более правильный способ отображения таймера. Есть ли более стабильный метод, чем постоянное обновление метки?


person linkmaster03    schedule 13.02.2010    source источник


Ответы (2)


Обновление метки должно работать совершенно надежно, поэтому я подозреваю, что вы делаете что-то еще не так. Вы используете треды? Как выглядит ваш код? Насколько мала вы можете сократить свою программу (удалив функциональность, а не запутав код), не решив при этом проблему?

person Community    schedule 13.02.2010
comment
Да, ярлык обновляется из темы. Я не уверен, к чему вы клоните со вторым вопросом, но я могу многое убрать из программы, сохранив при этом проблему. Таймер на самом деле является лишь частью программы, но проблема возникала даже тогда, когда не было никаких других функций. - person linkmaster03; 14.02.2010
comment
Я всегда с подозрением отношусь к потокам и gtk: это возможно, но сложно сделать правильно. Ваши симптомы звучат так, будто где-то отсутствует пара gtk threads_enter/threads_leave. - person ; 14.02.2010
comment
Мой другой вопрос был мотивирован тем, что процесс минимизации программы, сохраняя проблему, часто приводит к тому, что становится легче увидеть, в чем проблема. - person ; 14.02.2010
comment
Вероятно, это та же проблема, что и stackoverflow.com/questions/2066767/ - person Johannes Sasongko; 14.02.2010

Я понял проблему. Это действительно была проблема с потоками. Сам бы никогда не догадался. Хитрость заключается в использовании gobject.timeout_add() для создания таймера вместо многопоточного цикла. Вот некоторая информация о gobject.timeout_add():

http://faq.pygtk.org/index.py?req=show&file=faq01.021.htp

Не забудьте, чтобы ваша функция возвращала True, иначе таймер остановится.

person linkmaster03    schedule 14.02.2010