简单的PyQT5程序昨天运行良好,不再显示文件对话框

时间:2019-02-13 23:20:35

标签: python python-2.7 pyqt5

Spyder 3.3.2 Python 2.7.15 64位| Qt 5.6.2 | PyQt5 5.6 | Windows 10 iPython

以下代码昨天有效,打开了一个文件对话框,并允许我选择一个文件。它已经停止工作,我根本没有任何对话。

from PyQt5.QtWidgets import QFileDialog # note this is correct code as I use it
filename=QFileDialog.getOpenFileName(None,"Open Data File",'.',"*.xlsx)")    
print filename

昨天使用的其他使用PyQt5的简单示例不再起作用。我已经尝试了各种方法来解决此问题,但是却一无所获。我已经重新启动,重置Spyder,更新了conda,在调试中运行等等。绝对不是Python专家。

这是控制台日志,请注意,如果我只是自己执行import语句,那么我会在dir()中看到QFileDialog。如果我执行所有3行,则不会出现QFileDialog。如果我在控制台窗口中执行QFileDialog,则什么也不会发生。

> %reset
> 
> Once deleted, variables cannot be recovered. Proceed (y/[n])? y
> 
> dir() Out[3]:  ['In',  'Out',  '__builtin__',  '__builtins__', 
> '__name__',  '_dh',  '_i',  '_i3',  '_ih',  '_ii',  '_iii',  '_oh', 
> '_sh',  'exit',  'get_ipython',  'quit']
> 
> runfile('C:/Projects/GenIICoastalModel/Python/NonCHS/NonCHS/TestReadFile.py',
> wdir='C:/Projects/GenIICoastalModel/Python/NonCHS/NonCHS')
> 
> dir() Out[1]:  ['In',  'Out',  '_',  '__',  '___',  '__builtin__', 
> '__builtins__',  '__doc__',  '__name__',  '__package__',  '_dh', 
> '_i',  '_i1',  '_ih',  '_ii',  '_iii',  '_oh',  '_sh',  'exit', 
> 'get_ipython',  'quit']
> 
> '

1 个答案:

答案 0 :(得分:2)

我不知道为什么您的代码现在与过去的行为有所不同。但是,here简洁地解释了PyQt代码可以崩溃而不显示任何python错误回溯的原因。引用:

  

关于pyqt的第一件事是,它只是一个   Qt C ++库的包装器,因此几乎所有与pyqt相关的东西   您的应用程序中的代码作为C ++包装器(松散的定义)执行。

     

第二,了解pyqt是事件驱动的,因此   自己的事件循环,贯穿脚本的整个执行过程,   (据我了解)在它自己的执行线程中运行。

     

因此,内部出现的任何错误或异常   由qt信号/事件触发的插槽(单击按钮,按下按键等)   将由c ++ land中的qt事件循环处理,并且由于   因此,在上述广告位中引发的任何异常基本上都不会出现   python解释器的范围,因此不在python解释器之外引发   插槽的范围。因此,从本质上讲,虽然可能会引发例外情况   在qt广告位的范围内,一旦它离开了该广告位的范围,   该异常实际上已被清除。

当我在Spyder中执行示例代码时,我也遇到了崩溃,并且没有任何错误信息。但是,当我在Windows命令提示符下的IPython控制台中执行示例代码时,将显示以下简短错误消息:

  

QWidget:必须在QWidget之前构造一个QApplication

显然,问题在于没有显式构造QApplication对象。试试看:

from __future__ import print_function  # not needed in python 3
from PyQt5 import QtWidgets

class FileDialog(QtWidgets.QFileDialog):
    def __init__(self, parent=None):
        super(FileDialog, self).__init__(parent)  # can be simplified to `super().__init__(parent)` in python 3
        self.fileSelected.connect(lambda x: print(x))

def run_app():
    app = QtWidgets.QApplication([])
    file_dialog = FileDialog()
    file_dialog.show()
    app.exec_()

if __name__ == '__main__':
    run_app()