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

时间:2015-07-24 21:31:51

标签: python tkinter widget parent

我已经使用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次后,它会消失,然后按下“按钮”。显示在窗口中。

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

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

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

替换' root'用'标签',我的gui只是出了毛病。每次按下按钮都会消失。有时它会在几秒钟后重新出现,但有时它会在我尝试点击它时再次出现。

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

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

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

1 个答案:

答案 0 :(得分:2)

我认为没有理由说明你为何会看到这种行为。我在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)

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