Portál AbcLinuxu, 23. dubna 2024 17:13


Dotaz: Python + PyQt4 + vlákno..

19.8.2010 14:05 janhaj | skóre: 3
Python + PyQt4 + vlákno..
Přečteno: 150×
Odpovědět | Admin
zdravím..

snažím se napsat aplikaci v PyQt4. V hlavním, defaultním vlákně se vykreslí GUI a vytvoří se nový thread2, který mi přidá záznamy do QListWidgetu (které je vykresleno již). Když thread2 doběhne, potřeboval bych změnit zprávu ve stavové oblasti - statusBar. self.MainWindow.statusBar().showMessage(u'Seznam aktualizován') Když to udělám v threadu2, ukončí se program s chybou, že nemůžu přistupovat ke GUI z jiného threadu. Naopak, když dám while cyklus (jestli vlákno ještě žije) do hlavního, defaultního threadu, tak se GUI objeví, až když ten while skončí a to i přesto, že se ten cyklus nachází za self.MainWindow.show().

Ještě doplním, nové vlákno zakládám takhle: self.thread2 = threading.Thread(target = self.test_internetu) a startuji self.thread2.start()

Poradí někdo, jak to vyřešit? Jsem v tomhle nováček. Děkuji předem

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

19.8.2010 14:13 reqw5q23
Rozbalit Rozbalit vše Re: Python + PyQt4 + vlákno..
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejjednoduzsi bude poslat v tom vedlejsim threadu tesne pred koncem (a po dokonceni vsech akci) signal a na ten v hlavnim threadu reagovat aktualizaci statusbaru. Cyklus (sleep, atd) bych durazne nedoporucil, protoze to brzi interaktivitu.
19.8.2010 14:16 janhaj | skóre: 3
Rozbalit Rozbalit vše Re: Python + PyQt4 + vlákno..
to je logické.. ale vůbec nevím, jak bych to napsal.. uveď to prosím na nějakém příkladu.. díky
Řešení 1× (janhaj (tazatel))
19.8.2010 14:53 michal | skóre: 24 | blog: Blog
Rozbalit Rozbalit vše Re: Python + PyQt4 + vlákno..
Doporučuji na thready používat PyQt4 a ne přímo thready z Pythonu. Tady je kus kódu kde jsem to také řešil. Podle emitovaného signálu to volá funkce self.updateUi(self, outputlist), self.failed(), atd. Dokumentace http://doc.trolltech.com/4.6/qthread.html, signál finished() je volán po dokončení.
	self.thread = MainThread(self)
	self.changeStartButton(0)
	self.connect(self.thread, QtCore.SIGNAL("output"), self.updateUi)
	self.connect(self.thread, QtCore.SIGNAL("failed"), self.failed)
	self.connect(self.thread, QtCore.SIGNAL("newValue"), self.progressBar.setValue)
	self.connect(self.thread, QtCore.SIGNAL("finished()"), self.changeStartButton)
class MainThread(QtCore.QThread):
    def __init__(self, parent):
        QtCore.QThread.__init__(self, parent)
        self.progress = IterateProgress(self,parent.progressBar)
        self.parent = parent
    def prepare(self,setting):
	self.setting = setting
    def run(self):
	print 'RUN'
	try:
	    output_list = tomography(self.setting,  self.progress)  # vlastní program !!!
	except KeyboardInterrupt:
	    self.emit(QtCore.SIGNAL("newValue"),0)
	    return
	except:
	    self.emit(QtCore.SIGNAL("failed"))
	    self.emit(QtCore.SIGNAL("newValue"),0)
	    raise
	    return
	else:
	    self.emit(QtCore.SIGNAL("output"),output_list)
19.8.2010 17:03 janhaj | skóre: 3
Rozbalit Rozbalit vše Re: Python + PyQt4 + vlákno..
funguje, díky moc.. :) paráda! :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.