Как предоставить фокус диалога файла 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()
Ответ 5
Попробуйте метод focus_set. Подробнее см. Диалоговая версия Windows в PythonWare Введение в Tkinter.