2017-01-13 8 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秒スリープした後まで滞在します。ユーザーが[OK]または[キャンセル]をクリックするとすぐにダイアログが閉じることを期待しています。

+0

Windows、LinuxまたはMacOSとは何を意味しますか? – furas

+0

ほとんどのGUIは動作するには 'mainloop'('イベントループ ')が必要です。 'a.exec _()'( 'a = None'の前)を使ってPythonでmainloopを起動するとダイアログが閉じますが、このmainloopを止めるのに問題があります:) – furas

答えて

1

ほとんどのGUIは常に実行され、すべてのジョブをGUIで作成するmainloopevent loop)が必要です。

あなたはPyQtmainloopを開始するためにa.exec_()を使用することができ、それは、ダイアログを閉じますが、その後、あなたは、このメインループを停止する方法に問題があります:)

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) 
関連する問題