在tkinter中销毁小部件

时间:2016-02-08 13:35:54

标签: python tkinter global-variables

我设法通过调用函数来显示一个小部件,然后使用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()

1 个答案:

答案 0 :(得分:0)

两种一般可能性。

  • 您可以创建一个类上下文,以使用类变量(例如self.widget)跟踪小部件等元素。因此,请查看class documentation
  • 您返回并将小部件传递给您的函数。

    这不是非常适合回调,而是一般方法

    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通常缺乏代码的可读性和代码的可重用性。 (可以称之为“坏习惯”,但恕我直言,这受用例的影响很大)

如果您想重复使用小部件,并且只想使用Checkbutton建议使其显示/消失,我宁愿推荐grid_remove method而不是widget.destroy方法 < / p>