Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在QThread中打开QfileDialog后代码崩溃_Python 3.x_Multithreading_Pyqt5_Qfiledialog - Fatal编程技术网

Python 3.x 在QThread中打开QfileDialog后代码崩溃

Python 3.x 在QThread中打开QfileDialog后代码崩溃,python-3.x,multithreading,pyqt5,qfiledialog,Python 3.x,Multithreading,Pyqt5,Qfiledialog,我写了一个在GUI中显示的代码,算法的计算步骤。 为此,我使用负责检查步骤并在GUI中显示的QThread。单凭这一点就行了。 但是,用户的第一步是使用QFileDialog选择配置文件。在这个级别上,如果几秒钟后没有选择文件,那么在打开QFileDialog之后Python代码就会崩溃。当鼠标滑过打开的QFileDialog窗口时,会发生崩溃。 我对QThread的使用还比较陌生。我从这篇文章开始。 如果有人能帮我理解我的错误在哪里,那就太好了!谢谢 main_thread_simple.py

我写了一个在GUI中显示的代码,算法的计算步骤。 为此,我使用负责检查步骤并在GUI中显示的QThread。单凭这一点就行了。 但是,用户的第一步是使用QFileDialog选择配置文件。在这个级别上,如果几秒钟后没有选择文件,那么在打开QFileDialog之后Python代码就会崩溃。当鼠标滑过打开的QFileDialog窗口时,会发生崩溃。 我对QThread的使用还比较陌生。我从这篇文章开始。 如果有人能帮我理解我的错误在哪里,那就太好了!谢谢

main_thread_simple.py 从PyQt5.QtCore导入QThread 从PyQt5.QtWidgets导入QApplication、QLabel、QWidget、QGridLayout、QFileDialog 导入系统 导入简单的 导入操作系统 https://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt/6789205 类FormQWidget: 定义初始自我: 超形式,自我__ self.label1=QLabel self.label2=QLabel self.label3=QLabel self.label4=QLabel self.label5=QLabel self.label6=QLabel self.label7=QLabel self.label8=QLabel self.label9=QLabel self.label10=QLabel self.label11=QLabel 文件名,QFileDialog.getOpenFileNameself,Séselectionner le fichier de configuration,filter=*.xlsx 曲目\u fichier\u配置=os.path.basenamefileName self.obj=worker\u simple.Workerrepertoire\u fichier\u配置无父级! self.thread=QThread无父线程! 2-连接工人信号,形成方法槽,以发布数据。 self.obj.strred1.connectself.onstrread1 self.obj.strReady2.connectself.onStrReady2 3-将辅助对象移动到线程对象 self.obj.moveToThreadself.thread 4-将辅助信号连接到螺纹槽 self.obj.finished.connectself.thread.quit 5-将线程启动信号连接到辅助操作插槽方法 self.thread.started.connectself.obj.Main *-如果需要,线程完成信号将关闭应用程序! self.thread.finished.connectapp.exit 6-启动线程 self.thread.start 7-启动表单 自初始化 def initUIself: grid=QGridLayout self.setLayoutgrid grid.addWidgetself.label1,0,0 grid.addWidgetself.label2,1,0 self.move300150 self.setWindowTitle'outil de calcul' 自我表现 def onStrReady1self,txt: self.label1.setText{}.formattxt def onStrReady2self,txt: self.label2.setText{}.formattxt app=QApplicationsys.argv 形式 sys.exitapp.exec_ 戴尔应用程序 worker.py 从PyQt5.QtCore导入QObject、pyqtSignal、pyqtSlot 导入操作系统 从PyQt5.QtWidgets导入QFileDialog 类WorkerQObject: 完成=PYQT信号 strReady1=pyqtSignalstr strReady2=pyqtSignalstr def u_init__self,fichier_config,parent=None: 超级工作者,自我。\初始\父 self.fichier\u config=fichier\u config @pyqtSlot def Mainself:插槽不接受参数 nom_fichier_配置=self.fichier_配置 self.strread1.emit'début des calculs' “代码qui s”执行+appeláunefonction qui prend comme paramètre“nom_fichierèu configuration” self.strReady2.emit'fin des calculs' 自我完成
根据某个地方的文档,它声明如下:您不能从主线程外部创建或访问QtGUI对象,例如,任何子类QWidget或类似的对象。因此,不能从主线程以外的任何线程中运行QFileDialog解决方案很简单:首先在主线程中运行对话框,然后以配置文件路径作为参数启动工作线程。如上所述,Qt不支持主线程之外的任何gui操作。非常感谢,它帮助我澄清了这一点@丹尼斯·詹森:你的说法是对的。但在线程运行时从主线程运行也会产生此错误。试试看it@lone_coder我必须看到MRE或MUC演示这一点,因为在Python中有太多关于如何使用QThread或线程的错误信息,这是荒谬的,我可以想象当试图不正确地实现QThread或线程时会遇到各种各样的问题。此外,在我的免费在线实验室教室里,我与学生分享的QThread和Thread示例中没有任何一个存在任何问题,我的学生在将它们用作项目指导方针时也没有报告存在任何问题。