【问题标题】:Get variables emitted from thread by one signal to the main window in pyqt5?获取一个信号从线程发出的变量到pyqt5中的主窗口?
【发布时间】:2020-04-11 18:49:07
【问题描述】:

我想获取线程(worker)上的信号发出的值,信号有两个参数(两个列表,或列表和 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。 有什么帮助吗?

【问题讨论】:

    标签: python user-interface pyqt5 signals-slots qthread


    【解决方案1】:

    您可能认为使用括号可以让您获得具有单数参数签名的信号,但事实并非如此。可以使用multiple overloads 声明信号(如“不同的参数签名”),每个信号都包含在一个序列中,如列表或元组。

    所以,你所做的与以下内容完全相同:

    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 函数将与以前的基于单参数的版本一起使用。

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 2019-09-22
      • 2015-01-03
      • 2019-07-31
      • 2019-03-29
      • 2021-09-30
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多