Почему окно верхнего уровня уничтожается, когда главное окно свернуто?

from tkinter import *

root = Tk()
root.geometry("500x500")

toplevel = Toplevel()
toplevel.attributes("-toolwindow" , 1)

mainloop()

В этом коде, когда я сворачиваю главное окно и снова открываю его, окно верхнего уровня исчезает.

Вот изображение (GIF), описывающее мою проблему:

введите здесь описание изображения

Есть ли способ избежать этого?

Было бы здорово, если бы кто-нибудь мог мне помочь.

(ОС: Windows 10, версия Python: 3.9.1, версия Tkinter: 8.6)


person Lenovo 360    schedule 18.02.2021    source источник
comment
Вы пытались не устанавливать атрибут -toolwindow?   -  person Bryan Oakley    schedule 18.02.2021
comment
Да, проблема не возникает, когда я удаляю атрибут -toolwindow, но я использую этот атрибут, потому что хочу удалить параметр свертывания и развертывания в моем окне верхнего уровня.   -  person Lenovo 360    schedule 18.02.2021
comment
В Windows 7 окно tool остается открытым, даже если главное окно свернуто. Так что лучше укажите платформу, которую вы использовали.   -  person acw1668    schedule 19.02.2021
comment
@acw1668: я использую Windows 10.   -  person Lenovo 360    schedule 19.02.2021
comment
Я тестировал в Windows 10 (Python 3.9.1), и результат такой же, как и при тестировании в Windows 7.   -  person acw1668    schedule 19.02.2021
comment
@ acw1668: я разместил изображение (GIF), описывающее мою проблему.   -  person Lenovo 360    schedule 21.02.2021
comment
@acw1668 acw1668 Да, ты прав. Окно не исчезает, а просто уходит за все окна   -  person Lenovo 360    schedule 21.02.2021


Ответы (2)


Атрибут toolwindow специально разработан для того, чтобы окно скрывалось, когда скрывается корневое окно. Если вы не хотите такого поведения, не устанавливайте этот атрибут.

person Bryan Oakley    schedule 18.02.2021
comment
Я использую атрибут -toolwindow, потому что хочу удалить параметры свертывания и развертывания в моем окне верхнего уровня. Если причиной проблемы является атрибут -toolwindow, могу ли я что-нибудь еще сделать, чтобы удалить параметры свертывания и развертывания? - person Lenovo 360; 18.02.2021
comment
@ Lenovo360: вы можете установить флаг overrideredirect, который удалит всю строку заголовка. - person Bryan Oakley; 18.02.2021
comment
Я не хочу удалять всю строку заголовка, вместо этого я хочу удалить только опцию минимизации и максимизации. Есть ли способ добиться этого? - person Lenovo 360; 18.02.2021
comment
@Lenovo, да, но, вероятно, это будет зависеть от системы. - person Atlas435; 18.02.2021

С помощью acw1668 нашел ответ сам.

Окно верхнего уровня не исчезает; вместо этого он просто идет за всеми окнами.

Я нашел способ вернуть его:

from tkinter import *

root = Tk()
root.geometry("500x500")

def bring_window_back(e):
    toplevel.attributes('-topmost' , 1)
    toplevel.attributes('-topmost' , 0)
    
toplevel = Toplevel(root)
toplevel.attributes("-toolwindow" , 1)

root.bind("<Map>" , bring_window_back)

mainloop()

Примечание. Привязка <Map> может работать некорректно в Linux. Если вы ищете решение для этого, см.: Привязка обратных вызовов для минимизации и максимизации событий в окнах верхнего уровня

Надеюсь, это поможет вам всем.

person Lenovo 360    schedule 21.02.2021