我设法通过调用函数来显示一个小部件,然后使用 destroy 方法使其消失。
不幸的是,我设法做到这一点的唯一方法是使对象全局化,我知道这是一种糟糕的做事方式。我已经尝试了几次不使用全局来销毁对象,但没有一次奏效。
以下是相关代码:
def hayHijos():
print("ii")
z=var9.get()
if z==1:
var10 = StringVar()
global numHijosMat
numHijosMat=OptionMenu(app,var10,1,2,3,4,5,6,7,8,9,10)
numHijosMat.grid(column=2)
elif z==0:
print("aa")
numHijosMat.destroy()
var9 = IntVar()
hijosEntrePartes = Checkbutton(app, text="Hijos entre las partes", variable=var9, command=hayHijos)
hijosEntrePartes.var=var9
hijosEntrePartes.grid()
两种一般可能性。
- 您可以创建一个类上下文来跟踪元素,例如使用类变量(例如 self.widget(的小部件。因此,请查看类文档
-
您返回并将小部件传递给您的函数/从您的函数传递。
这不太适合回调,而是一种通用方法
def function(var, widget=None): """ Widget is an optional argument. If not passed, it is initialized with None """ if var.get()==1: # some code to create your widget # make sure to use 'widget = ...' to create it # to have the reference for your return # call at the end of the function else: # some code to destroy your widget # e.g. widget.destroy() return widget
使用此代码可以轻松使用小部件,而无需将其全局化。另一个变量用于代码中的全局行为。"var9"。你也应该传递这个。您需要使用
lambda
来调整回调以传递两者。更推荐的是这里的类方法,因为 lambda 通常缺乏代码的可读性和代码的可重用性范围。(也可以称之为"坏习惯",但恕我直言,这受到用例的高度影响(
如果您想重用小部件并且只想让它像使用复选框所建议的那样出现/消失,我宁愿推荐grid_remove方法而不是 widget.destroy 方法