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']
>
> '
答案 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()