2010-07-30 3 views
9

Я использую OS X. Я дважды щелкаю по моему сценарию, чтобы запустить его из Finder. Этот скрипт импортирует и запускает функцию ниже.Как настроить фокус диалога с файлом Tkinter

Я хочу, чтобы сценарий представлял диалоговое окно открытого файла Tkinter и возвращал список выбранных файлов.

Вот что я до сих пор:

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) 

я дважды щелкните скрипт, терминал открывает диалоговое Tkinter файл открывается. Проблема в том, что диалоговое окно файла находится за терминалом.

Есть ли способ подавить терминал или обеспечить, чтобы диалог файла заканчивался сверху?

Спасибо, Wes

+0

Это может помочь: http://stackoverflow.com/questions/1810497/hide-console-for-tkinter-app-on-osx –

+0

Спасибо. Я изучу использование этого в долгосрочной перспективе. Сейчас эта программа очень проста и быстро выполняет итерацию. Я искал быстрый способ решения этой досады. – Wes

ответ

0

Попробуйте метод focus_set. Для получения дополнительной информации см. Страницу Dialog Windows в PythonWare'sAn Introduction to Tkinter.

+0

Спасибо. Я прочитал его. Я не уверен, как использовать метод set_focus() во встроенном диалоговом окне файла TK? – Wes

8

Для всех, кто попадает сюда через Google (как и я), вот хак, который я разработал, который работает как в Windows, так и в Ubuntu. В моем случае, я на самом деле все еще нуждаюсь в терминале, но просто хочу, чтобы диалог был сверху, когда отображается.

# 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

Блестящий! отлично работает –

+0

Используйте это: root.attributes ('- alpha', 0.3), чтобы сделать окно невидимым –

4

Использование AppleEvents для фокусировки на Python. Например:

import os 

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

Механизмы Tk (которые, похоже, сводятся к 'focus_set()' и 'focus_force()' в корневом или родительском окне) может работать на Linux или в другом месте, но они не работают на Mac OS X. Это было единственное, что я нашел, что работает на Mac. –

1

имена файлов = tkFileDialog.askopenfilenames (родитель = корень, InitialDir = starting_dir)

хорошо родитель = корень достаточно для создания tkFileDialog на вершине, это просто означает, что ваш корень не на вершине, попробуйте сделать root сверху, и автоматически tkFileDialog займет верхнюю часть родителя.

Смежные вопросы