for qthread create array of pyqtsignal
class mythread(qtcore.qthread): trigger = [] in range(0,10): trigger.append(qtcore.pyqtsignal(int)) def __init__(self, function): self.function = function super(mythread, self).__init__(none) def run(self): self.function()
the main part of following code looks like:
class main(qtwidgets.qmainwindow): def __init__(self): self.myqthread = mythread(lambda: self.printtest(5)) def starttestthread(self): self.myqthread.trigger[0].connect(self.update_text) self.myqthread.start() def printtest(self,inputvalue): in range (0,100): print(inputvalue*i) time.sleep(0.2) self.myqthread.trigger[0].emit(5) def update_text(self, thread_no): self.ui.my_listwidget.additem('123')
executing starttestthread leads following error
attributeerror: 'pyqt5.qtcore.pyqtsignal' object has no attribute 'connect'
if initiliaize pyqtsignal without being array, works. doing wrong? in advance!
you cannot create list of pyqtsignal(s).
unfortunately way pyqt implement signals use bit of python magics, , pyqtsignal
objects "converted" pyqtboundsignal
when qobject
subclass (technically class have pyqtwrappertype
metaclass) loaded.
you can solve problem in different ways:
1) wrap signal
i'm not 100% sure this, it's modified version of attempt:
class foowrap(qobject): signal = qtcore.pyqtsignal(int) class mythread(qtcore.qthread): trigger = [foowrap] * 10
2) don't use list
if number of signals fixed, create them directly signal1
, signal2
, signaln
, can call them directly
if can determine signal call @ runtime can signal need using gettattr(object, name)
function, example:
getattr(self.myqthread, 'signal' + str(n)).connect(self.update_text)
and
getattr(self.myqthread, 'signal' + str(n)).emit(value)
3) use 1 signal
use 1 signal emit 2 values, 1 identify "step" in signal emitted, , second value, doing connected functions can decide based on "step" value.
Comments
Post a Comment