Я разрабатываю многопоточное приложение в pygtk, используя quick, и застрял с потоками. Поэтому я экспериментирую с различными возможностями и обнаружил, что мой поток работает только тогда, когда я делаю что-то в gui. Вот мой код.
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
потоке, но оно обновляется только тогда, когда я нажимаю какую-то кнопку или какие-то другие события графического интерфейса. Почему так происходит? Почему поток не работает в фоновом режиме?
решение1
Потоки и GTK не всегда хорошо работают вместе. Есть несколько трюков, которые помогают, но не удивляйтесь странным ошибкам. Недавно я удалил все потоки из приложения, и это стало намного лучше.
Итак, первое, о чем вам следует подумать, — сможете ли вы переписать свое приложение, чтобы воспользоваться преимуществами асинхронных методов GLib.
Если вы настаиваете на наличии тем, помните о следующих двух правилах:
- Вызовите GLib.treads_init() как можно раньше в вашем коде
- При вызове событий GUI в потоке оберните их в GLib.idle_add()
Это правила, а не рекомендации. Вы должнывсегдаделайте это при работе с потоками.
решение2
Использование time.sleep() не очень хорошая идея, когда вы используете gtk. Вы можете попробовать использовать событие таймера. (Я больше не использую quick, но это должно сработать, я думаю.)
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