[英]Python PyQt5 threading QObject: Cannot create children for a parent that is in a different thread
[英]PyQt Multi Threading, Cannot create children for a parent
我正在使用python 2.7,而pyqt遇到了一些多线程问题
我正在尝试读取一个sqlite文件,并将其内容导入到应用程序的主GUI中。
所以我创建了一个Thread类
class Thread_OpenSqlite(QtCore.QThread):
def __init__(self,parent=None):
super(Thread_OpenSqlite,self).__init__(parent)
def run(self):
self.emit(QtCore.SIGNAL("open_sqlite()"))
并且,当用户单击菜单栏以打开SQlite文件时,将调用一个函数,并创建该线程类的实例并调用该线程。
def selectSQLite(self):
self.typeflag=4
self.openpath=QFileDialog.getOpenFileName()
if os.path.exists(str(self.openpath)):
#Thread to Open Sqlite
self.threadopenSqlite=Thread_OpenSqlite()
self.connect(self.threadopenSqlite, QtCore.SIGNAL("open_sqlite()"), self.sqlOpen, QtCore.Qt.DirectConnection)
self.threadopenSqlite.start()
在此sqlOpen()方法中,我访问了sqlite的行并将数据放置在几个QLabel中, self.ui是我的mainWindow GUI(包含,重新转换,setupUi等功能)的对象。
def sqlOpen(self):
conn = sqlite3.connect(str(self.openpath))
print self.openpath
cursor = conn.cursor()
try:
abc=cursor.execute('select some,rows,of,sqlite,to,read,from from general_info limit 0,1')
for row in abc:
self.ui.pushButton_2.show()
self.ui.pushButton_2.setText(str(row[6]))
self.ui.lineEdit.show()
self.ui.pushButton_9.show()
self.ui.label_2.setText(str(row[0]))
self.ui.label_9.setText(str(row[1]))
self.ui.label_10.setText(str(row[2]))
self.ui.label_11.setText(str(row[3]))
self.ui.label_12.setText(str(row[4]))
self.ui.label_13.setText(str(row[5]))
self.ui.label_14.setText(str(row[6]))
self.ui.label_15.setText(str(row[7]))
conn.close()
except sqlite3.OperationalError:
conn.close()
但是执行完线程后,我的整个应用程序在回显此错误后崩溃。
QObject :: setParent:无法设置父级,新的父级在另一个线程中
QObject :: setParent:无法设置父级,新的父级在另一个线程中
QObject:无法为处于不同线程中的父级创建子级。
(父母是QLabel(0x3315318),父母的线程是QThread(0x288fa78),当前线程是Thread_OpenSqlite(0x358e3a8)
QObject:无法为处于不同线程中的父级创建子级。 (父母是QTextDocument(0x367d728),父母的线程是Thread_OpenSqlite(0x358e 3a8),当前线程是QThread(0x288fa78)
我已经阅读了多个pyqt线程和以前的问题,它们的共同点是
主线程中GUI的元素无法在run方法本身中进行修改,因此您必须使用信号和插槽机制来发出信号并将其连接到将完成此工作的插槽。
请注意, 我也尝试使用QueuedConnection代替DirectConnection,虽然它解决了我的问题,但是在退出应用程序时,它显示了python崩溃的弹出窗口,我不需要
我还在同一个应用程序中完成了各种多线程操作,以从GUI元素中获取和获取数据,但这是唯一一个困扰我的人。
谁能告诉我上面我错了吗?
提前致谢。
看起来您的线程代码只是发出一个运行open_sqlite
的信号, open_sqlite
它将直接在主线程中运行。 另外,似乎不需要线程化。 如果仅填充标签(而不是表格),则数据不是很动态,因此您可能不需要在线程中运行。 只需在程序初始化或响应事件的过程中在主线程中运行它即可。 尽可能避免多线程; 众所周知,打破某些东西(使用任何语言或框架)都很容易。
如果必须,则使用线程池(基于python的本地线程或基于Qt的线程池),然后在事件循环中轮询池,直到完成工作为止。 工作池更加安全,易于调试和推理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.