根据跟踪变量使用tkinter创建/销毁小部件

问题描述 投票:0回答:2

我想根据条目小部件的当前状态创建一个按钮:如果有写入的内容,则应创建按钮,但如果再次清除该按钮,则应再次销毁该按钮。

在下面的代码中我实现了“类似”的东西:

from tkinter import *
from tkinter import Tk

root = Tk()

check = StringVar()

def create(*args):
    if check.get() != '':
        grid_014 = Button(root, width=40, text='something changed', bd=5)
    else:
        grid_014 = Label(root, width=40, text='', bd=5)

    grid_014.grid(column=1, row=2)

grid_entry = Entry(root, width=40, textvariable=check)
grid_entry.grid(column=1, row=1)

check.trace('w', create)

root.mainloop()

但后来我意识到,并不完全。因为,据我所知,我正在做的是用标签小部件替换按钮小部件,反之亦然,总是在彼此之上。这是可见的,因为按钮小部件的边界不会消失。据我了解,这也造成了内存泄漏。

我现在的问题是,如果条目小部件中的更改导致if条件发生更改,那么“清除”上一个小部件的最佳方法是什么?

这背后的原因是,我想让程序的用户可以与它的某些部分进行交互,只有在满足某些条件之前,比如在文件名写入后才会出现“保存”按钮,像这样的事情。

例如,使用跟踪变量而不是破坏使其变灰的小部件,可能是另一种选择。 (对此的工作解决方案由Nae的链接给出,谢谢(!),使用按钮的“正常”和“禁用”状态;但是,我也希望看到其他建议,这些建议会对清除小部件的可能性也是如此,因为在一般情况下,如上面的代码所示,它在if条件下不会是相同的小部件,因此人们将无法使用“正常”/“禁用”状态相同的小部件)。

python tkinter trace
2个回答
1
投票

你的认识是正确的AFAIK。我能想到的最好的方法就是在创建新的小部件之前简单地销毁小部件,而不是替代方案。

添加另一个ifdestroys grid_014,如果它存在,如:

if grid_014:
    grid_014.destroy()
if check.get() != '':
    grid_014 = Button(root, width=40, text='something changed', bd=5)
else:
    grid_014 = Label(root, width=40, text='', bd=5)

1
投票

你可以检查entry小部件是否为空,然后你disabled如果entry不是空的那么应该是活动的。

from tkinter import *
from tkinter import Tk

root = Tk()

check = StringVar()

def create(*args):
    if check.get() != '':
        grid_014 = Button(root, width=40, text='something changed', bd=5)
    elif len(check.get())==0:
        grid_014 = Button(root, width=40, state="disabled")
    else:
        grid_014 = Label(root, width=40, text='', bd=5)

    grid_014.grid(column=1, row=2)

grid_entry = Entry(root, width=40, textvariable=check)
grid_entry.grid(column=1, row=1)

check.trace('w', create)

root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.