-1

私が取り組んでいるアプリでは、すべてのGUIを処理するためのクラス設定があります。このクラスの1つのメソッドは、フレームを作成し、ループからラジオボタンのグループにデータを入力します。このフレームを再描画するために、このメソッドはクラスの外部から複数回呼び出されます。私が抱えている問題は、フレームが再描画されたときに、実際には既存のフレームを上書きしているだけであるということです(古いフレームは保持されます)。したがって、後の呼び出しでオプションが少ない場合でも、前のオプションは引き続き表示されます。最初にフレームで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 に答える