可以在GUI外部使用QtGui.QFileDialog.getOpenFileName()吗?

时间:2015-12-15 15:17:24

标签: python user-interface pyqt filedialog

我在这个简单的代码行中遇到了奇怪的行为,我想在pyqt GUI类之外使用

from PyQt4 import QtGui

FilePath=QtGui.QFileDialog.getOpenFileName(None,'choose the file')

当我第一次实现它时,它工作(可能是因为我之前运行了一些其他代码,我无法追溯)。

然后在重新启动python后,它停止工作并崩溃说:

  

QWidget:必须在QPaintDevice之前构建QApplication

在GUI中实现时,完全相同的代码可以正常工作,其中第一个参数当然是self

但是我想在GUI环境之外的一个外部函数中使用相同的filedialog用于不同的目的。

是否有可能以及实现这一点的方式/解决方法?我想避免使用wx,easygui或tk

2 个答案:

答案 0 :(得分:0)

要使用Qt UI元素(例如QFileDialog),您通常必须运行QApplication。它看起来有点不正统,但你可以通过在QApplication之前实例化QFileDialog来让你的代码段运行,就像这样

from PyQt4 import QtGui
app = QtGui.QApplication([])
FilePath=QtGui.QFileDialog.getOpenFileName(None,'choose the file')

从技术上讲,这可行,但我不太确定我可以支持这样做。

答案 1 :(得分:0)

Qt应用程序围绕事件循环构建,需要QApplication实例。对话框有自己的事件循环,所以如果你想要的只是一个向导(一系列按顺序打开/关闭的对话框),那么原则上你需要的只是QApplication实例。以下适用于PyQt 5:

from PyQt5 import Qt
app = Qt.QApplication([])
FilePath=Qt.QFileDialog.getOpenFileName(None,'choose the file')
print(FilePath)

但是,如果您有其他代码假定应用程序事件循环,则所有投注均已关闭。在这种情况下,您可以执行以下操作:

from PyQt4 import Qt
app = Qt.QApplication([])
FilePath=Qt.QFileDialog.getOpenFileName(None,'choose the file')
print(FilePath)
...create widgets....
QTimer.singleShot(someWidgetMethod)
app.exec_()

单次定时器只会在app.exec_()期间触发,因此会将一些代码作为事件循环的一部分调用。

所有这一切,最好是创建一个主窗口并将插槽连接到信号并调用app.exec_()。 PyQt中包含许多示例,请检查它们。