无法使grid_remove()工作

时间:2013-01-22 17:39:13

标签: python tkinter

在我正在开发的应用程序中,我有一个类设置来处理我的所有GUI。此类中的一种方法创建一个框架,并从循环中填充一组radiobutton。将从类外部多次调用此方法以重绘此帧。我遇到的问题是,当重绘帧时,它实际上只是覆盖了现有的帧(旧帧仍然存在)。因此,如果稍后调用中的选项较少,则较早的选项仍然可见。我已经尝试首先在帧上执行grid_remove但是无法使其工作。所以我的问题是,为什么grid_remove()不能在下面的initMech()方法中工作?

    #!/usr/bin/env python

   from Tkinter import *

   class MWindow(Frame):
       def __init__(self, parent) :
           Frame.__init__(self, parent)
           self.parent = parent
           self.initUI()

       def initUI(self):
           topframe = Frame(self.parent, bd=2, relief=GROOVE, padx=5, pady=5, width=300, height=50)
           topframe.grid(row=0, column=0)
           desc = Button(topframe, text="list1", command=lambda:set_list(1))
           desc.grid(row=0,column=1)
           desc2 = Button(topframe, text="list2", command=lambda:set_list(2))
           desc2.grid(row=0,column=2)

       def initMech(self):
           try:
               radio_frame.grid_remove()
           except:
               print "can't remove"
           radio_frame = Frame(self.parent, bd=2, relief=GROOVE, padx=5, pady=5, width=300, height=50)
           radio_frame.grid(row=1, column=0)
           variant=StringVar()
           c = 0
           for x in chas.v_list:
               Radiobutton(radio_frame, text=x,variable=variant, value=x, command=lambda x = x:chas.set_vari(x)).grid(row=0, column=c)
               c = c+1

       def onExit(self):
           self.parent.destroy()

   class Mech():
       def set_chass(self,chass):
           try:
               if self.chassis == chass:
                   pass
               else:
                   self.chassis = chass
                   del self.vari
           except AttributeError:
               self.chassis = chass

       def load_vari(self):
           if self.chassis == 1:
               self.v_list = ["a","b","c"]
           else:
               self.v_list = ["w", "x", "y", "z"]
           win.initMech()

       def set_vari(self, vari):
           self.vari = vari

   def set_list(num):
       chas.set_chass(num)
       chas.load_vari()

   root = Tk()
   win = MWindow(root)
   chas = Mech()
   root.mainloop()

1 个答案:

答案 0 :(得分:0)

它无效,因为您正在使用名为radio_frame的局部变量,并且尚未定义该变量。最有可能的是,您忽略的错误消息正是在告诉您。你为什么要删除一个尚未创建的框架?

另外,您是否知道grid_remove仅从视图中删除小部件,它不会销毁它?因此,如果您多次调用此函数,您将拥有此框架的几个不可见版本,所有这些都使用了内存。