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

Python 根据跟踪变量使用tkinter创建/销毁小部件,python,tkinter,trace,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, tex

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

在下面的代码中,我实现了一些“类似”的功能:

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条件下,它将不是同一个小部件,因此不能使用按钮的“正常”/“禁用”状态相同的小部件)。

您的实现是正确的。我能想到的最好的方法是,在创建一个新的小部件之前,简单地销毁这个小部件(如果它存在的话)

添加另一个
如果
销毁
网格的
如果存在,例如:

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)

你的认识完全正确。我能想到的最好的方法是,在创建一个新的小部件之前,简单地销毁这个小部件(如果它存在的话)

添加另一个
如果
销毁
网格的
如果存在,例如:

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)

您可以检查
条目
小部件是否为空,然后禁用
条目
如果
条目
不为空,则应激活

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()

您可以检查
条目
小部件是否为空,然后禁用
条目
如果
条目
不为空,则应激活

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()
可能的重复可能的重复