在我正在开发的应用程序中,我有一个类设置来处理我的所有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()
答案 0 :(得分:0)
它无效,因为您正在使用名为radio_frame
的局部变量,并且尚未定义该变量。最有可能的是,您忽略的错误消息正是在告诉您。你为什么要删除一个尚未创建的框架?
另外,您是否知道grid_remove
仅从视图中删除小部件,它不会销毁它?因此,如果您多次调用此函数,您将拥有此框架的几个不可见版本,所有这些都使用了内存。