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

Python 简单的PyQT5程序昨天运行良好,不再显示文件对话框,python,python-2.7,pyqt5,Python,Python 2.7,Pyqt5,Spyder 3.3.2 Python 2.7.15 64位| Qt 5.6.2 | PyQt5 5.6 | Windows 10 伊皮顿 下面的代码昨天起作用,打开一个文件对话框,允许我选择一个文件。它停止工作了,我根本没有任何对话 from PyQt5.QtWidgets import QFileDialog # note this is correct code as I use it filename=QFileDialog.getOpenFileName(None,"Open Data

Spyder 3.3.2 Python 2.7.15 64位| Qt 5.6.2 | PyQt5 5.6 | Windows 10 伊皮顿

下面的代码昨天起作用,打开一个文件对话框,允许我选择一个文件。它停止工作了,我根本没有任何对话

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']
> 
> '

我不知道为什么您的代码现在的行为与过去不同。但是,PyQt代码可以在不显示任何python错误回溯的情况下崩溃的原因已经得到了简洁的解释。引述:

关于pyqt,首先要了解的是,它只是一个 围绕Qt C++库的包装器,所以几乎所有的PyQT相关 在您的应用程序中,作为C++包装器(松散定义)执行。 第二,了解pyqt是事件驱动的,因此具有 在脚本执行过程中运行的自己的事件循环 (据我所知)在它自己的执行线程中运行

因此,在 qt信号/事件触发的插槽(按钮点击、按键等) 将在C++域中通过QT事件循环进行处理,并且因为 这样,在所述插槽中提出的任何异常都将基本上被排除在外 python解释器的作用域,因此不会在 插槽的范围。因此,在本质上,虽然可能会提出一个例外 在qt插槽的上下文中,一旦它离开该插槽的范围, 这个例外基本上被删除了

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

QWidget:必须在QWidget之前构造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()

我不知道为什么您的代码现在的行为与过去不同。但是,PyQt代码可以在不显示任何python错误回溯的情况下崩溃的原因已经得到了简洁的解释。引述:

关于pyqt,首先要了解的是,它只是一个 围绕Qt C++库的包装器,所以几乎所有的PyQT相关 在您的应用程序中,作为C++包装器(松散定义)执行。 第二,了解pyqt是事件驱动的,因此具有 在脚本执行过程中运行的自己的事件循环 (据我所知)在它自己的执行线程中运行

因此,在 qt信号/事件触发的插槽(按钮点击、按键等) 将在C++域中通过QT事件循环进行处理,并且因为 这样,在所述插槽中提出的任何异常都将基本上被排除在外 python解释器的作用域,因此不会在 插槽的范围。因此,在本质上,虽然可能会提出一个例外 在qt插槽的上下文中,一旦它离开该插槽的范围, 这个例外基本上被删除了

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

QWidget:必须在QWidget之前构造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()

PyQt.qtwidts
更改为
PyQt5.qtwidts
对不起,我在帖子中输入错误,而不是在代码中。我将其更正为我实际尝试运行的内容,正如您所建议的,失败了。将
PyQt.qtwidts
更改为
PyQt5.qtwidts
抱歉,我在帖子中输入错误,而不是在代码中输入错误。我将其更正为我实际尝试运行的内容,正如您所建议的那样,失败了。感谢您的回答和对Python 2.7兼容性的编辑,现在可以工作了。感谢您的回答和对Python 2.7兼容性的编辑,现在可以工作了。