2017-01-13 47 views
1

我正在使用PyQt從用戶獲取文件名。我已經開發了一個最小的例子來展示這個問題。如果我使用靜態函數QFileDialog.getOpenFileName,並且傳遞了QFileDialog.DontUseNativeDialog,則文件對話框將按預期行爲。如果我沒有提供該選項,則用戶選擇文件時對話框將不會關閉。該對話框僅在腳本完成執行後關閉。使用本地對話框時PyQt QFileDialog不會關閉

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秒之後睡眠。我希望只要用戶點擊「確定」或「取消」,對話框就會關閉。

+0

你是什麼意思'原生' - Windows,Linux或MacOS? – furas

+0

大多數GUI需要'mainloop'('event loop')才能工作。您可以使用'a.exec _()'(在'a = None'之前)在PyQt中啓動主循環,並關閉對話框,但是您將遇到阻止此主循環的問題:) – furas

回答

1

大多數GUI需要mainloopevent loop)它運行所有的時間,並使所有的工作在GUI中。

您可以使用a.exec_()開始在PyQtmainloop並關閉對話框,但那麼你就會有問題,如何制止這種主循環:)

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)