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



我使用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()
如您所料,当您运行这段代码时,您将得到一个带有绿色背景和按钮的小窗口。按10次后,按钮消失,窗口显示"10"。

当我为按钮小部件使用不同的父小部件时,我遇到的问题发生了。例如,当我修改

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

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

用'label'替换'root',我的GUI出故障了。每次我一按按钮,它就消失了。有时它会在几秒钟后重新出现,但有时它只会在我试图点击它时重新出现。

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

我在想;为什么会发生这种情况?有没有办法解决这个问题,而不使用'root'作为父按钮(这将使我的应用程序更加复杂,或者至少会迫使我重建很多gui的东西)

我试图找到有关这个问题的信息,但是我找不到。

我不认为你看到这种行为有一个很好的理由。我在OSX上没有看到它,但OSX上的按钮的行为与其他平台有点不同。使用一个标签作为另一个窗口的父窗口应该是完全可以的,而不会看到这个闪烁。

一个可能的解决方法是在重新配置标签时调用按钮小部件上的lift。也许堆叠顺序在您身上发生了变化,导致标签在按钮上方。

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

例如,您可以创建您的小部件并像这样调用place:
button = Button(root, command=add, text='+1', font=('arial', 20, 'bold'))
button.place(in_=label, relx=0, rely=0, relwidth=1, relheight=100)

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

最新更新