【问题标题】:Tkinter how to immediately destroy a window created in a Python function call?Tkinter 如何立即销毁在 Python 函数调用中创建的窗口?
【发布时间】:2020-01-09 12:18:09
【问题描述】:

Python 程序循环调用 tkinter 函数来创建 GUI 窗口。理想情况下,每个窗口都会在控制权从 tkinter 函数传回主 Python 序列之前被销毁,以便在下一次循环时可以在清晰的屏幕上创建一个新窗口。相反,所有已创建的窗口都保留在屏幕上,直到 Python 循环完成,此时所有窗口都被销毁。有没有办法管理事件循环以强制每个窗口在从 tkinter 函数返回之前被销毁? (我知道隐藏问题的一种方法是定义窗口的精确 x,y 位置,以便每个后续窗口都覆盖其前任窗口,但这只是一个表面修复。我想知道如何纠正根本问题。)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)

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    在正常情况下,您应该只有 1 个 Tk 实例。见Why are multiple instances of Tk discouraged?

    因此我建议使用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()
    

    【讨论】:

    • 感谢您抽出宝贵时间提供该建议。事实证明,这似乎是导致问题的旧版本 python 的一些怪癖。我无法让您的带有 f 字符串格式的版本在 3.5 中工作,所以我尝试了 3.7.2 和 3.8.1。我发现我的原始版本在两个较新的版本中都可以正常工作,没有 Windows 持久性。
    • f-string 不是问题的核心——如果你需要坚持使用旧版本的 Python,你可以使用"{}".format()
    • 当然。刚刚提到 f-string 只是为了说明这是促使我尝试升级的原因。
    猜你喜欢
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多