2010-07-30 5 views
9

Ich verwende OS X. Ich doppelklicke mein Skript, um es im Finder auszuführen. Dieses Skript importiert und führt die folgende Funktion aus.So geben Sie den Fokus des Tkinter-Dateidialogs

Ich möchte, dass das Skript einen Tkinter-Dateidialog anzeigt und eine Liste der ausgewählten Dateien zurückgibt.

Hier ist, was ich bisher:

def open_files(starting_dir): 
    """Returns list of filenames+paths given starting dir""" 
    import Tkinter 
    import tkFileDialog 

    root = Tkinter.Tk() 
    root.withdraw() # Hide root window 
    filenames = tkFileDialog.askopenfilenames(parent=root,initialdir=starting_dir) 
    return list(filenames) 

ich auf die doppelte Skript, Terminal öffnet, die Tkinter-Datei öffnet sich. Das Problem ist, dass der Dateidialog hinter dem Terminal ist.

Gibt es eine Möglichkeit, das Terminal zu unterdrücken oder sicherzustellen, dass der Dateidialog oben angezeigt wird?

Danke, Wes

+0

Dies kann helfen: http://StackOverflow.com/Questions/1810497/Hide-Console-for-Tkinter-App-on-OSX –

+0

Vielen Dank, ich werde auf lange Sicht damit umgehen. Im Moment ist dieses Programm sehr einfach und iteriert schnell. Ich suchte nach einer schnellen Methode, um diesen Ärger zu lösen. – Wes

Antwort

8

Für jeden, der hier über Google endet (wie ich), hier ist ein Hack, den ich ausgedacht habe, der in Windows und Ubuntu funktioniert. In meinem Fall brauche ich eigentlich noch das Terminal, möchte aber nur, dass der Dialog bei der Anzeige oben steht.

# Make a top-level instance and hide since it is ugly and big. 
root = Tkinter.Tk() 
root.withdraw() 

# Make it almost invisible - no decorations, 0 size, top left corner. 
root.overrideredirect(True) 
root.geometry('0x0+0+0') 

# Show window again and lift it to top so it can get focus, 
# otherwise dialogs will end up behind the terminal. 
root.deiconify() 
root.lift() 
root.focus_force() 

filenames = tkFileDialog.askopenfilenames(parent=root) # Or some other dialog 

# Get rid of the top-level instance once to make it actually invisible. 
root.destroy() 
+0

Brilliant! funktioniert perfekt –

+0

Verwenden Sie diese: root.attributes ('- alpha', 0.3), um das Fenster unsichtbar zu machen –

4

Verwenden Sie AppleEvents, um Python den Fokus zu geben. ZB:

import os 

    os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 
+0

Die Tk-Mechanismen (die auf 'focus_set()' und 'focus_force()' im Root- oder Parent-Fenster zu kochen scheinen) funktionieren unter Linux oder anderswo, aber sie funktionieren nicht unter Mac OS X. Das war das einzige, was ich auf Mac gefunden habe. –

1

Dateinamen = tkFileDialog.askopenfilenames (parent = Wurzel, InitialDir = starting_dir)

gut parent = Wurzel für die Herstellung tkFileDialog oben genug ist, ist es auf einfache Weise, die Ihre Wurzel nicht oben ist, Versuchen Sie, root an der Spitze zu machen, und tkFileDialog wird automatisch an die Spitze des übergeordneten Elements gesetzt.

Verwandte Themen