Как предоставить фокус диалога файла Tkinter

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

Я хотел бы, чтобы script представлял диалоговое окно открытого файла 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)

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

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

Спасибо, Уэс

Ответ 1

Для всех, кто попадает сюда через 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()

Ответ 2

Используйте AppleEvents, чтобы сосредоточиться на Python. Например:

import os

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

Ответ 3

filenames = tkFileDialog.askopenfilenames(parent=root,initialdir=starting_dir)

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

Ответ 4

У меня была эта проблема с окном позади Spyder:

root = tk.Tk()
root.overrideredirect(True)
root.geometry('0x0+0+0')
root.focus_force()
FT = [("%s files" % ftype, "*.%s" % ftype), ('All Files', '*.*')]
ttl = 'Select File'
File = filedialog.askopenfilename(parent=root, title=ttl, filetypes=FT)
root.withdraw()