Код ниже предназначен для запроса имени файла с filedialog
со скрытым корневым окном, после чего корень снова появляется и показывает метку с выбранным именем файла. Однако в MacOS 14.5 и Python 3.9.6 deiconify
не вызывает повторное появление окна. Мне нужно щелкнуть значок Python в доке, чтобы появилось окно. Если я заменю строку filedialog
на file_name = '\example\file\name'
, такой проблемы не возникнет. Как сделать так, чтобы окно появлялось без необходимости нажимать на значок?
from tkinter import Tk, filedialog, Label
root = Tk()
root.withdraw()
file_name = filedialog.askopenfilename(parent=root, title = "Select File")
if file_name:
Label(root, text=file_name, padx=20, pady=20).pack()
root.update()
root.deiconify()
root.mainloop()
else:
root.destroy()
Обновлено: Интересно, что если я добавлю cursor = "cross"
к Label
, курсор действительно изменится на крест при наведении курсора на место на экране, где в конечном итоге появляется окно. Так что оно вроде бы как-то там есть, и просто невидимо.
Да, но, к сожалению, возникает та же проблема.
Черт... Я могу попытаться разобраться с этим позже.
Вы можете попробовать сразу добавить root.attributes("-topmost", True)
, а затем root.attributes("-topmost", False)
, или root.focus_set()
, или root.focus_force()
, или любую их комбинацию. Вы также можете попробовать то, что они делают, в исходном коде Python
Раньше я пробовал все это по отдельности, а теперь все вместе, но проблема не устранена. Я чувствую себя в тупике.
Помогает root.geometry()
?
Я попробовал это только что mainloop
только сейчас, и ничего не изменилось
Попробуйте не создавать root
перед вызовом askopenfilename()
(он создается неявно, если parent
есть None
). Создайте root
внутри if
блока.
в этом простом примере вы можете уничтожить root перед if file_name:
и создать новый root = Tk()
в if file_name:
.
Я также попробовал не передавать родительский элемент для askopenfilename()
и создать два экземпляра Tk()
(хотя это и не рекомендуется). Я попытался воспроизвести эту проблему на другом Mac, но не смог, так что это может быть проблема, связанная с конкретным компьютером. Стоит ли мне голосовать за закрытие этой темы?
Обновление до Python 3.12 устранило проблему.
Вы пробовали использовать
root.iconify()
вместоroot.withdraw()
? Я думаю, что они ведут себя по-разному на Mac и на Windows, но я сейчас не на своем Mac, поэтому не могу сказать наверняка.