Получить переменные, испускаемые из потока одним сигналом в главное окно в pyqt5? - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу получить значения, излучаемые сигналом в потоке (работнике), сигнал принимает два аргумента (два списка или list и int). Это работа, а сигнал принимает 2 аргумента. Но когда я пытаюсь получить значения этого двух списков в главном окне, я получаю только один список. Так как же получить два списка в главном окне из одного сигнала?

class Worker(QThread):
    authResult = QtCore.pyqtSignal((list,list))
    def __init__(self):
       super(Worker, self).__init__()
       self.flag = True
       self.s="vide"
def run(self):
    self.auth()

def auth(self):
    c=0
    Malist=[]
    k=c+600
    while c<10:
        c+=1
        time.sleep(0.3)
        print(c)

        Malist.append(k)
        k=k+1

    Malist2=['a','b','c']
    self.authResult.emit( Malist,Malist2)

И это главное окно содержит кнопку, я хочу только напечатать значения двух списков Malist и Malist2

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(300, 200))    
        self.setWindowTitle("PyQt button example ") 


        pybutton = QPushButton('Click me', self)
        pybutton.clicked.connect(self.clickMethod)
        pybutton.resize(100,32)
        pybutton.move(50, 50)


        pybutton2 = QPushButton('Afficher !!', self)
        pybutton2.clicked.connect(self.afficher)
        pybutton2.resize(60,32)
        pybutton2.move(160, 50)   

  def clickMethod(self):
    self.thread=Worker()
    self.thread.authResult.connect(self.handl)
    self.thread.start()
    print(self.thread.s)


  def handl(self,result):
    print(type(result))
    print(result)
    print("Cc!!")

Результат: [600, 601, 602, 603, 604, 605, 606, 607, 608, 609] Отображается только список 1. Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 11 апреля 2020

Вы можете подумать, что использование скобок позволит вам получить сигнал с сигнатурой единственного аргумента, но это не то, что происходит. Сигналы могут быть объявлены с множественными перегрузками (как в "разных сигнатурах аргументов"), каждый из которых содержится в последовательности, такой как список или кортеж.

Итак, вы делаете точно так же как:

authResult = QtCore.pyqtSignal([list, list])

, что приведет к тому же значению:

authResult = QtCore.pyqtSignal(list, list)

, так как есть только одна подпись.

Затем вы получаете первый список только потому, что функция принимает только один аргумент. Если вы добавите второй аргумент, будет получен и второй список:

    def handl(self, result, result2):
        print(type(result))
        print(result, result2)
        print("Cc!!")

# which will print:
<class 'list'>
[600, 601, 602, 603, 604, 605, 606, 607, 608, 609] ['a', 'b', 'c']
Cc!!

Несколько иным решением может быть использование одного аргумента object вместо:

authResult = QtCore.pyqtSignal(object)

С этим функция handl будет работать с предыдущей версией с одним аргументом.

...