Tkinter, как немедленно уничтожить окно, созданное при вызове функции Python? - PullRequest
0 голосов
/ 09 января 2020
Программа

A Python l oop вызывает функцию tkinter для создания окна GUI. В идеале каждое окно должно быть уничтожено до того, как управление переходит из функции tkinter обратно в основную последовательность Python, чтобы на следующем проходе l oop можно было создать новое окно на чистом экране. Вместо этого происходит то, что все созданные windows остаются на экране до тех пор, пока не закончится Python l oop, и тогда все windows будут уничтожены. Есть ли способ управлять событием l oop, чтобы заставить каждое окно быть уничтоженным до возврата из функции tkinter? (Я знаю, что одним из способов скрыть проблему было бы определение точного местоположения x, y windows, чтобы каждое последующее окно покрывало свои предшественники, но это было бы просто косметическим исправлением c. I хочу знать, как исправить основную проблему.) Python 3.5, macOS

import os
from tkinter import *
from tkinter.ttk import *

def display(text):
    alert = Tk()
    alert.geometry('370x200')
    var = StringVar()
    var.set(text)
    message = Label(alert, textvariable = var, font=('arial',20)).pack(pady=20)
    okButton = Button(alert, text = 'OK', command = alert.destroy).place(x=225,y=100)

    alert.mainloop()

days = [ 'Mon', 'Tue', 'Wed' ]

for day in days:
    message = "Today is " + day
    display(message)

1 Ответ

1 голос
/ 09 января 2020

При нормальных обстоятельствах у вас должен быть только 1 экземпляр Tk. См. Почему не рекомендуется использовать несколько экземпляров Tk?

Поэтому я предлагаю использовать Toplevel вместо нескольких экземпляров Tk, чтобы вы могли вызывать соответствующий экземпляр только при необходимости и иметь на одно root окно вверх (которое можно при необходимости скрыть):

from tkinter import *
from tkinter.ttk import *

root = Tk()
root.withdraw()


def display(text):
    alert = Toplevel()
    alert.geometry('370x200')
    text_var = StringVar()
    text_var.set(text)
    root.v = text_var
    Label(alert, textvariable=text_var, font=('arial', 20)).pack(pady=20)
    Button(alert, text='OK', command=lambda: next_day(alert)).place(x=225, y=100)


def next_day(top):
    top.destroy()
    try:
        display("Today is {}".format(next(days)))
    except StopIteration:
        root.destroy()


days = iter(['Mon', 'Tue', 'Wed'])

display("Today is {}".format(next(days)))

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...