2017-01-13 6 views
1

Ich verwende PyQt, um einen Dateinamen vom Benutzer abzurufen. Ich habe ein minimales Beispiel entwickelt, um das Problem zu zeigen. Wenn ich die statische Funktion QFileDialog.getOpenFileName verwende und den QFileDialog.DontUseNativeDialog überlasse, verhält sich der Dateidialog wie erwartet. Wenn ich diese Option nicht zur Verfügung stelle, wird der Dialog nicht geschlossen, wenn der Benutzer eine Datei auswählt. Der Dialog wird erst geschlossen, nachdem das Skript die Ausführung abgeschlossen hat.PyQt QFileDialog schließt nicht, wenn das native Dialogfeld verwendet wird

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) 

Wenn der Benutzer eine Datei auswählt, wenn „DontUseNativeDialog“ nicht verwendet wird, wird der Dialog erst nach dem 10 Sekunden Schlaf bleiben. Ich würde erwarten, dass der Dialog geschlossen wird, sobald der Benutzer auf OK oder Abbrechen klickt.

+0

was meinst du 'nativ' - Windows, Linux oder MacOS? – furas

+0

die meisten GUI benötigt 'Hauptschleife' (' Ereignisschleife') zu arbeiten. Sie können 'a.exec _()' (vor 'a = None') verwenden, um die Hauptschleife in PyQt zu starten und es schließt den Dialog, aber dann haben Sie Probleme, diese Hauptschleife zu stoppen :) – furas

Antwort

1

Die meisten GUI braucht mainloop (event loop), die alle Zeit läuft und alle Arbeit in GUI macht.

Sie a.exec_() verwenden können mainloop in PyQt zu starten und es schließt Dialog, aber dann werden Sie Problem haben, wie diese mainloop zu stoppen :)

a.quit() kann es schließen, aber wenn Sie es vor a.exec_() verwenden dann nicht mainloop nicht empfange diese Nachricht und schließe nicht. Wenn Sie nach a.exec_() setzen, wird es nie ausgeführt, weil a.exec_() den gesamten Code blockiert, bis Sie mainloop beenden. Aber Sie können QTimer mit a.quit verwenden, um mainloop zu informieren, um es auszuführen, nachdem es gestartet wird.

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) 
Verwandte Themen