Python 删除前检查tkinter中是否存在小部件

Python 删除前检查tkinter中是否存在小部件,python,tkinter,Python,Tkinter,我正在使用下拉菜单创建几个小部件。我想在删除小部件之前检查它是否存在(从下拉菜单上的上一个选择)。我正在使用以下代码: self.ndim_options, self.ndim_options_var = self.DropdownMenuCommand(("1","2","3"),'-',"Number of indirect dimensions","-") def DropdownMenuCommand(self,options,status,name,row): if row

我正在使用下拉菜单创建几个小部件。我想在删除小部件之前检查它是否存在(从下拉菜单上的上一个选择)。我正在使用以下代码:

self.ndim_options, self.ndim_options_var = self.DropdownMenuCommand(("1","2","3"),'-',"Number of indirect dimensions","-")

def DropdownMenuCommand(self,options,status,name,row):

    if row == "-":
      row = self.row

    optionLabel = tk.Label(self.frame, bg='turquoise')
    optionLabel["text"] = name
    optionLabel.grid(row=row, column=0, sticky='w')
    var = tk.StringVar(self)
    var.set(status)
    w = tk.OptionMenu(self.frame, var, *options, command = self.setdimensionproperties)
    w.config(bg = 'paleturquoise')
    w["menu"].config(bg = 'paleturquoise')
    w.grid(row=row, column=1)
    self.row += 1
    return w, var

def setdimensionproperties(self,val):
    row = self.RowEnd

    if val == "3":  #Set parameters for a 4D (3 indirect dimensions)

      #Remove any existing weighting functions
      if self.weightingFuncNameDim2.winfo_exists():
        self.weightingFuncNameDim2.grid_remove()

      self.weightingFuncNameDim2, self.weightingFuncNameDim2_var = self.DropdownMenu(("sinebell","gaussian", "sinebell2"),'-', "Weighting function dimension 2",row)
但是,如果小部件尚未创建,则会出现属性错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 3141, in __call__
    self.__callback(self.__value, *args)
  File "test.py", line 224, in setdimensionproperties
    if self.weightingFuncNameDim2.winfo_exists():
AttributeError: Window instance has no attribute 'weightingFuncNameDim2'

理想情况下,如果小部件存在,我希望if语句返回
1
,如果小部件不存在,则返回
0
,这就是我所认为的
。winfo_exists()
所做的。我怎样才能避开这个错误呢?另外,如何确保
.grid\u remove
同时删除小部件和标签?

我看到了三种可能的解决方案。按优先顺序:

  • self.weightingFuncNameDim2=None
    添加到类的
    \uuuu init\uuuu
    方法中,如果self.weightingFuncNameDim2不是None且self.weightingFuncNameDim2.winfo\u存在(),则将
    条件更改为

  • 如果hasattr(self,“weightingFuncNameDim2”)和self.weightingFuncNameDim2.winfo_存在():

  • if
    块放入捕获并忽略AttributeErrors的try Exception块中

  • …但是,如果尚未创建小部件,则会出现属性错误:

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
        return self.func(*args)
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 3141, in __call__
        self.__callback(self.__value, *args)
      File "test.py", line 224, in setdimensionproperties
        if self.weightingFuncNameDim2.winfo_exists():
    AttributeError: Window instance has no attribute 'weightingFuncNameDim2'
    
    最好的解决方案是确保类始终具有该属性,即使小部件不存在。将其设置为
    None
    ,然后在创建小部件时将其重置。然后,您的条件变为:

      if self.weightingFuncNameDim2 is not None:
        self.weightingFuncNameDim2.grid_remove()
    
    如何确保.grid_remove同时删除小部件和 标签


    grid\u remove
    始终只从视图中删除一个小部件。但是,如果该小部件包含其他小部件,则这些其他小部件也将从视图中删除

    对于“如何确保.grid\u remove同时删除小部件和标签?”我没有任何想法,但我认为您更喜欢半个答案而不是没有答案。(在未来,可能更好的做法是针对不同的问题分别发表帖子,这样回答者就不必担心这种困境)请注意,“if self.weightingFuncNameDim2不是None:”与“if self.weightingFuncNameDim2”相同:@CurlyJoe:这不完全正确。实际上,这通常已经足够好了,但在我看来,如果你想显式地检查
    None
    的值,你应该显式地检查
    None
    的值,而不是采取“真实”的快捷方式。这可能是一个微妙的区别,但您应该始终努力使您的代码尽可能清晰。谢谢您的回答。关于问题的第二部分,grid_remove()似乎保留了标签。因此,在我给出的示例中,下拉菜单被删除,但文本“Weighting function name dimension 2”仍然保留。