使用多线程

时间:2018-05-09 15:05:44

标签: python python-3.x pyqt pyqt5 python-multithreading

我正在编写一个简单的程序,读取写入文件的新输入并将其显示在弹出窗口中。

我正在使用PyQt5:
A)文件更改(QtCore)
B)窗口(QtWidgets)

  

请注意,根据PyQt参考指南,我实际上有一个使用信号的工作模型。但无法弄清楚如下,因此我不了解事情的运作方式。

在测试实现时遇到了多线程问题。 这是我的问题的简化示例:

from PyQt5 import QtWidgets
import sys
import threading

def additem(window):
    """ generates label in window at bottom """
    print("Adding label to window on thread {}".format(threading.currentThread()))
    row = window.layout().rowCount() + 1
    btn = QtWidgets.QPushButton('button_' + str(row), window)
    window.layout().addWidget(btn,row,1)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    w.setLayout(QtWidgets.QGridLayout())
    # set to timers after 3,6 will generate label in window
    threading.Timer(3,additem,args=(w,)).start()
    threading.Timer(6,additem,args=(w,)).start()
    w.show()
    sys.exit(app.exec_())

输出:

  

向窗口添加标签
  QObject :: setParent:无法设置父级,新父级位于不同的线程

我尝试设置全局队列来传递对象,但仍然是同样的错误。

虽然我现在提出异常的原因,但我不明白如何避免它。

一次尝试是直接传递顶级对象“app”然后按索引获取窗口(app是最高父级):

...
threading.Timer(3,additem,args=(app,)).start()
...

def additem(app):
    w = app.allWidgets()[0]
    ...

我知道PyQt是一个用python包装的C库,但我不熟悉C. app对象是指向内存堆中对象的指针,
为什么它不能操纵物体?
是在新线程中复制的对象? (以为我仍然可以“更新”那个对象)

0 个答案:

没有答案