【问题标题】:Destroying widget in tkinter在 tkinter 中销毁小部件
【发布时间】:2016-02-08 13:35:54
【问题描述】:

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

【问题讨论】:

  • 你有什么问题?
  • 他的问题是有哪些方法可以避免使用全局变量声明。

标签: python tkinter global-variables


【解决方案1】:

两种一般可能性。

  • 您可以创建一个类上下文来跟踪元素,例如使用类变量(例如 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
    

    使用此代码可让您轻松使用小部件,而无需使其全局化。另一个变量用于代码中的全局行为。 “变量9”。你也应该把这个传下去。 您可能需要使用 lambda 来调整您的回调以通过两者。 更推荐的是这里的类方法,因为 lambdas 通常缺乏代码的可读性和代码的可重用性。 (也可以称之为“坏习惯”,但恕我直言,这受用例影响很大)

如果您想重用小部件并且只想让它按照使用 Checkbutton 的建议出现/消失,我宁愿推荐 grid_remove method 而不是 widget.destroy 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2016-06-30
    • 2016-03-22
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多