根据跟踪变量

时间:2018-02-28 11:22:25

标签: python tkinter trace

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

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

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条件下不会是相同的小部件,因此人们将无法使用“正常”/“禁用”状态相同的小部件)。

2 个答案:

答案 0 :(得分:1)

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

添加另一个if destroy 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) ,如果它存在,例如:

DateTime

答案 1 :(得分: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()