python - 使用 native 对话框时 PyQt QFileDialog 不会关闭

标签 python pyqt

我正在使用 PyQt 从用户那里获取文件名。我开发了一个最小的例子来展示这个问题。如果我使用静态函数 QFileDialog.getOpenFileName,并且传递 QFileDialog.DontUseNativeDialog,则文件对话框的行为符合预期。如果我不提供该选项,当用户选择文件时该对话框将不会关闭。该对话框仅在脚本完成执行后关闭。

import sys
import time
from PyQt4.QtGui import *
a = QApplication(sys.argv) 
filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*',    '*', QFileDialog.DontUseNativeDialog) #works
#filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*', '*') #doesn't work
a.quit()
a = None
print filename
print "Dialog should be gone"
time.sleep(10)

当用户选择文件时,如果不使用“DontUseNativeDialog”,对话框将保持打开状态,直到 10 秒休眠后。我希望用户单击“确定”或“取消”后对话框立即关闭。

最佳答案

大多数 GUI 需要 mainloop(事件循环),它始终运行并在 GUI 中完成所有工作。

您可以使用a.exec_()PyQt中启动mainloop并关闭对话框,但随后您将遇到如何停止的问题这个主循环:)

a.quit() 可以关闭它,但如果您在 a.exec_() 之前使用它,则 mainloop 不会收到此消息消息并且不关闭。如果您放在 a.exec_() 之后,那么它将永远不会执行,因为 a.exec_() 会阻止所有代码,直到您结束 mainloop。但是你可以使用QTimera.quit来通知mainloop在启动后执行它。

import sys
import time
from PyQt4.QtGui import *
from PyQt4.QtCore import QTimer

a = QApplication(sys.argv) 

#filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*',    '*', QFileDialog.DontUseNativeDialog) #works
filename = QFileDialog.getOpenFileName(None, 'Open File', '.', '*', '*') #doesn't work

# run a.quit after 100ms
QTimer.singleShot(100, a.quit)
# run mainloop
a.exec_()

print(filename)
print "Dialog should be gone"
time.sleep(10)

关于python - 使用 native 对话框时 PyQt QFileDialog 不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639727/

相关文章:

python - Tensorflow 2.0 Autograph 间接修改(隐藏状态)可以工作,但它不应该工作

python - 将 Acrobat Reader 嵌入 PyQt5 应用程序会导致空白页面 [PyQt5]

python - numpy.loadtxt() 中的转换错误

python - 我不明白 Python 中的负边界切片。这应该如何工作?

python - 如何控制 QToolBar 中的 QAction 按钮间距?

python - 如何使 QTreeWIdgetItem 可选择性编辑

python - 带有二进制数的 QSpinbox

python - "import package"的目的是什么?

python - 如何将 html 附加到我的 QWebEngineView

python - 在 PyQt 中创建带有行号的文本区域(textEdit)