Python 使用本机对话框时,PyQt QFileDialog不会关闭

Python 使用本机对话框时,PyQt QFileDialog不会关闭,python,pyqt,Python,Pyqt,我正在使用PyQt从用户处获取文件名。我已经制定了一个最低限度的例子来说明这个问题。如果我使用静态函数QFileDialog.getOpenFileName,并传递QFileDialog.DontUseNativeDialog,则文件对话框的行为与预期相同。如果我没有提供该选项,当用户选择文件时,对话框将不会关闭。该对话框仅在脚本完成执行后关闭 import sys import time from PyQt4.QtGui import * a = QApplication(sys.argv)

我正在使用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
,它会关闭对话框,但您将无法停止此mainloop:)

a.quit()
可以关闭它,但如果在
a.exec()
之前使用它,则
mainloop
不会收到此消息,也不会关闭。如果您在
a.exec\uz()
之后放置,则它将永远不会执行,因为
a.exec\uz()
会阻止所有代码,直到您结束
mainloop
。但是您可以使用
QTimer
a.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)

“本机”是什么意思?Windows、Linux或MacOS?大多数GUI需要
mainloop
event loop
)才能工作。您可以使用
a.exec()
(在
a=None
之前)在PyQt中启动mainloop,它会关闭对话框,但您将无法停止此mainloop:)