Я разрабатываю многопоточное приложение на pygtk, использующее быстро и зацикленное на потоках. Поэтому я экспериментирую с различными возможностями и обнаружил, что мой поток работает только тогда, когда я что-то делаю в графическом интерфейсе. Вот мой код
t = threading.Thread(target=self.calc,args=(treeiter))
t.daemon = True
t.start()
def calc(self,treeiter):
store=self.builder.get_object('liststore1')
per=0
while 1:
print "Calcing and changing percent,per="+str(per)
tore.set_value(treeiter,4,str(int(per))+"%")
per+=1
time.sleep(1)
Я пытаюсь обновить значение в liststore
потоком, но он обновляется только при нажатии какой-либо кнопки или других событий графического интерфейса. Почему это так? почему поток не работает в фоновом режиме?
Темы и GTK не всегда хорошо играют вместе. Есть несколько хитростей, которые помогают, но не удивляйтесь, если есть странные ошибки. Недавно я удалил все потоки из приложения, и теперь он намного лучше.
Итак, первое, о чем вы должны подумать, - можете ли вы переписать свое приложение, чтобы использовать преимущества асинхронных методов GLib.
Если вы настаиваете на наличии потоков, помните об этих двух правилах:
Это правила, а не рекомендации. Вы должны всегда делать это при работе с потоками.
Использование time.sleep () не очень хорошая идея, когда вы используете gtk. Вы можете попробовать использовать событие таймера. (Я больше не использую быстро, но это должно работать, я думаю.)
from gi.repository import GLib
class Just_for_correct_coding():
self.per = int()
def start(self):
GLib.timeout_add_seconds(1, self.calc)
def calc(self,treeiter):
store=self.builder.get_object('liststore1')
print "Calcing and changing percent,per="+str(self.per)
tore.set_value(treeiter,4,str(int(self.per))+"%")
self.per+=1
return True #important if you want to keep the timer running