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)
您需要确保堆叠顺序正确。最简单的方法是简单地确保在创建标签后的某个时间创建按钮。
我使用 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)
您需要确保堆叠顺序正确。最简单的方法是简单地确保在创建标签后的某个时间创建按钮。