我正在编写一个简单的程序,读取写入文件的新输入并将其显示在弹出窗口中。
我正在使用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对象是指向内存堆中对象的指针,
为什么它不能操纵物体?
是在新线程中复制的对象? (以为我仍然可以“更新”那个对象)