-1

在我正在开发的应用程序中,我有一个类设置来处理我的所有 GUI。此类中的一个方法创建一个框架并从循环中填充一组单选按钮。该方法将在类外部多次调用以重绘该帧。我遇到的问题是,当重新绘制框架时,它实际上只是覆盖了现有框架(旧框架仍然存在)。因此,如果稍后调用中的选项较少,则较早的选项仍然可见。我曾尝试先在框架上执行 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()
4

1 回答 1

1

It is not working because you're using a local variable named radio_frame, and that variable isn't defined yet. Most likely, the error message you are ignoring is telling you exactly that. Why are you trying to remove a frame that you haven't yet created?

Also, are you aware that grid_remove only removes the widget from view, it doesn't destroy it? Thus, if you call this function several times you'll have several invisible versions of this frame, all using up memory.

于 2013-01-22T19:34:03.550 回答