Python tkinter:标签更新后按钮消失

Python tkinter: button disappearing after label update

我使用 Python 已经有一段时间了,我用 GUI 制作了一些应用程序。当我编写我的新应用程序时,我遇到了一些我认为很奇怪的 tkinter 行为。

考虑以下代码:

from tkinter import *

root = Tk()
root.geometry('200x200')

label = Label(root, bg='green', text='0', font=('arial', 40, 'bold'))
label.place(x=0, y=0, width=200, height=200)

def add():
    label['text'] = int(label['text']) + 1
    if label['text'] == 10:
        button.place_forget()

button = Button(root, command=add, text='+1', font=('arial', 20, 'bold'))
button.place(x=50, y=50, width=100, height=100)

root.mainloop()

如您所料,当您 运行 这段代码时,您会得到一个带有绿色背景和按钮的小 window。按下按钮 10 次后,它会消失,并在 window.

中显示一个“10”

当我为按钮小部件使用不同的父小部件时,我遇到了这个问题。例如,当我更改此行时

button = Button(root, command=add, text='+1', font=('arial', 20, 'bold'))

button = Button(label, command=add, text='+1', font=('arial', 20, 'bold'))

将 'root' 替换为 'label',我的图形用户界面出现了故障。每次我按下按钮它都会消失。有时它会在几秒钟后重新出现,但有时它只会在我尝试单击它时重新出现。

经过更多测试后,我发现每次父标签更新时按钮都会消失。

我在想;为什么会这样?有没有一种方法可以在不使用 'root' 作为按钮的父级的情况下解决问题(这会使我的应用程序变得更加复杂,或者至少会迫使我重建很多 gui 东西)

我试图查找有关此问题的信息,但找不到任何信息。

我认为您看到这种行为没有充分的理由。我在 OSX 上看不到它,但是 OSX 按钮的行为与其他平台略有不同。使用一个标签作为另一个标签的父级应该是完全没问题的 window 而不会看到这种闪烁。

一种可能的解决方法是在您重新配置标签时在按钮小部件上调用 lift。也许堆叠顺序正在改变,导致标签位于按钮上方。

最后,您是否知道可以使用具有相对坐标的位置,并且即使没有 parent/child 关系,小部件也可以相对于其他小部件?您似乎担心如果不能以 parent/child 关系创建两个小部件,则必须更改大量代码。

例如,您可以创建小部件并像这样调用 place

button = Button(root, command=add, text='+1', font=('arial', 20, 'bold'))
button.place(in_=label, relx=0, rely=0, relwidth=1, relheight=100)

您需要确保堆叠顺序正确。最简单的方法是简单地确保在创建标签后的某个时间创建按钮。