无法使grid_remove()正常工作

0 投票
1 回答
1078 浏览
提问于 2025-04-17 13:21

在我正在开发的应用程序中,有一个类专门用来处理所有的图形界面(GUI)。这个类里面有一个方法,它会创建一个框架,并通过一个循环来填充一组单选按钮。这个方法会被外部多次调用,以重新绘制这个框架。现在我遇到的问题是,当框架被重新绘制时,其实只是覆盖了原来的框架(旧的框架还在)。所以如果在后面的调用中选项变少,之前的选项仍然会显示出来。我尝试在框架之前使用grid_remove,但一直没能成功。所以我想知道,为什么下面的initMech()方法中的grid_remove()没有起作用?

    #!/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 个回答

1

这个不管用是因为你用的一个叫 radio_frame 的局部变量,但这个变量还没有定义。你可能忽略的错误信息其实就是在告诉你这一点。你为什么要去移除一个还没创建的框架呢?

另外,你知道 grid_remove 只是把这个小部件从视图中移除,并没有把它销毁吗?所以如果你多次调用这个函数,就会有好几个看不见的这个框架在占用内存。

撰写回答