tkinter Toplevel: пытается понять причуду закрытия окна - PullRequest
0 голосов
/ 08 сентября 2018

Я создал простое приложение Python / tkinter. Он открывает главное окно, используя Tk (), и дополнительное окно, используя Toplevel.

Я заметил необычное поведение: если я пытаюсь закрыть дополнительное окно перед первым щелчком по основному окну, оно закрывает оба окна (что не является желаемым поведением). Однако, если я сначала нажму на главное окно, а затем закроюсь из дополнительного окна, главное окно останется открытым.

Желаемое поведение таково: я хочу иметь возможность закрываться из дополнительного окна, оставляя главное окно открытым. И я не хочу сначала нажимать на главное окно, чтобы оно оставалось открытым. Вы должны иметь возможность перейти непосредственно к дополнительному окну и закрыть его, при этом оно также не закроет главное окно.

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

import tkinter as tk

primary = tk.Tk()
primary.title("primary")
primary.geometry("200x200+500+300")

secondary = tk.Toplevel(primary)
secondary.title("secondary")
secondary.wm_geometry("300x300+100+100")

# hack lines: makes it so you can immediately
# close out of secondary without also closing
# out of primary. without these lines of code,
# primary will also close along with secondary
# unless you first click on primary.
primary.lift(secondary)
secondary.lift(primary)

primary.mainloop()

Есть ли способ добиться того же эффекта без этого взлома? Я пытаюсь понять, почему мне нужно включить этот код в код.

Когда люди пишут код, который запускает вторичное окно, это часто происходит в контексте запуска его из основного окна. Это заставляет пользователя сначала щелкнуть по главному окну. Но поскольку я запускаю оба окна одновременно, нет никакой гарантии, что пользователь сначала нажмет на главное окно. Поэтому, возможно, именно поэтому мне нужно было взломать метод lift ().

Не для суеты, но я ищу простое решение с плоским кодом, а не ориентированное на класс. Таким образом, решение, которое не включает ключевые слова class, self, super (), init, main, что-нибудь с двойным подчеркиванием и т. Д., Мы надеемся, достижимо. Я думаю, что может быть небольшое исправление или небольшое дополнение к тому, что я написал. Но я понятия не имею, что это будет.

Я использую Windows, поэтому не уверен, применимо ли это к Mac или Linux.

...