2014-02-18 1 views
9

Ich kann in meinem Programm Folgendes tun, um einen einfachen Dateidialog zu öffnen und den ausgewählten Dateipfad zu drucken. Leider verschwindet es nicht sofort, wenn der Benutzer die Datei auswählt und bleibt länger als 5 Minuten in der Nähe. Wie mache ich das Fenster sofort verschwinden, sobald eine Auswahl getroffen wurde, bevor Sie mehr Python-Code ausführen? Nach dem Tkinter Code versuche ich ein paar Videos mit OpenCV zu importieren, was die Verlangsamung verursachen könnte. Mein OpenCV-Code wird korrekt ausgeführt, und ich glaube nicht, dass es ein Problem damit alleine gibt (d. H. Eine Interaktion verursacht den Fehler & vielleicht wird ein intensiver Prozess gestartet, bevor Tkinter seinen GUI-Dialog schließt).Was könnte dazu führen, dass ein geöffnetes Dateidialogfenster in Tkinter/Python wirklich langsam geschlossen wird, nachdem der Benutzer eine Datei ausgewählt hat?

import Tkinter as Tk 
import cv2 
from tkFileDialog import askopenfilename 
root = Tk.Tk() 
root.withdraw() # we don't want a full GUI, so keep the root window from appearing 
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file 
print(filename) 

cap = cv2.VideoCapture('video.mp4') # this works just fine 

Ich benutze Python 2.7 und Mac OS X 10.9, wenn das nützlich ist.

[BEARBEITEN: Dies scheint nicht ein Problem für alle zu sein, aber es ist für mich, also ändere ich die Frage, um auch das Problem zu debuggen. Ich möchte nicht, dass etwas ausgeführt wird, bis das Dialogfeld "Datei öffnen" von Tkinter fertig ist und in der GUI geschlossen wird. Es scheint, dass ein nachfolgender Schritt in meinem Programm (ein offener CV-Video-Import) irgendwie dazu führen könnte, dass Tkinter die Dinge verlangsamt, also möchte ich sicherstellen, dass es schließt, bevor irgendein neuer Prozess gestartet wird. Wieder schließt das Tkinter-Fenster nach 5 Minuten tatsächlich ...]

+1

Der Dialog geht für mich weg. Wenn der Dialog erscheint, klicken Sie auf den "Öffnen" -Button? Wenn Sie auf "Öffnen" klicken oder auf eine Datei doppelklicken, sollte der Dialog verschwinden. –

+0

Hmm - es geht nicht weg für mich. Irgendeine Idee, wie man debuggt? – user391339

+2

Nach Ihrer Bearbeitung klingt es so, als würden Sie der Ereignisschleife keine Möglichkeit geben, alle Ereignisse zu verarbeiten. Was passiert, wenn Sie nach dem Abrufen des Dateinamens 'root.update()' aufrufen? –

Antwort

11

Ich hatte einige Probleme mit Tkinter-Dialogfeldern. Wie du, saß der Dialog einfach da, nachdem ich eine Datei ausgewählt hatte. Ich habe nicht versucht, es für sehr lange zu verlassen, es könnte nach 5 Minuten verschwunden sein, wie du gesagt hast. Nach vielen zufälligen Experimenten habe ich festgestellt, dass root.update()vor die askopenfilename() Zeile schien es zu beheben schien.

als Referenz, ist dies der Code, den ich mit teste:

import sys 
from tkinter import * 
from tkinter import filedialog 

#instantiate a Tk window 
root = Tk() 

#set the title of the window 
root.title('Tk test') 

#dunno what this does, fixes askopenfilename if I use it. 
root.update() 

print(filedialog.askopenfilename(title='dialogue? surely.')) 
+3

Arbeitete für mich. +1 –

+0

funktioniert nicht für mich auf OSX und Python2. Der Dialog ist noch vorhanden, während ich die Eingabedatei verarbeite. ** EDIT: ** Der Aufruf von 'root.update()' _after_ 'askopenfilename()' funktioniert jedoch. – Plasma

2

Genau das Problem, das ich hatte - manchmal der Dateidialog würde nach einer Weile verschwinden, manchmal nicht. Aber es schien immer ein späteres Statusfenster zu blockieren. Das Hinzufügen von root.update() hat beide Probleme sofort behoben.

Verwandte Themen