在删除i之前检查tkinter中是否存在widget

2024-10-01 15:47:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

但是,如果没有创建小部件,我会得到一个属性错误:

^{pr2}$

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


Tags: selfif部件vartkgridrowoptions
2条回答

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

  1. self.weightingFuncNameDim2 = None添加到类的__init__方法中,并将if条件改为if self.weightingFuncNameDim2 is not None and self.weightingFuncNameDim2.winfo_exists():

  2. 将条件改为if hasattr(self, "weightingFuncNameDim2") and self.weightingFuncNameDim2.winfo_exists():

  3. 将您的if块放在一个try-except块中,该块捕捉并忽略AttributeErrors。

...However, if the widget hasn't been created, I get an Attribute error:

最好的解决方案是确保类始终具有属性,即使小部件不存在。将其设置为None,然后在创建小部件时重置它。然后你的条件变成:

  if self.weightingFuncNameDim2 is not None:
    self.weightingFuncNameDim2.grid_remove()

how can I make sure that .grid_remove removes both the widget and the label?

grid_remove将始终只从视图中删除一个小部件。但是,如果该小部件包含其他小部件,那么这些其他小部件也将从视图中删除。在

相关问题 更多 >

    热门问题