我想创建一个按钮,具体取决于条目窗口小部件的当前状态:如果有写入的内容,则应创建该按钮,但如果再次清除该按钮,则应再次销毁该按钮。
在下面的代码中,我实现了类似的东西:
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条件下不会是相同的小部件,因此人们将无法使用“正常”/“禁用”状态相同的小部件)。
答案 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()