销毁 tkinter 中的小部件



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

相关内容

  • 没有找到相关文章

最新更新