使用grid_forget() - Tkinter时帧不会消失

时间:2015-07-27 12:31:28

标签: python tkinter

我正在使用单选按钮在Tkinter中的帧之间切换,使用grid_forget(),如其他一个问题所建议的,与帧之间的切换有关,但由于某种原因,旧帧不会消失。

以下是我的代码中的一些摘录:

def zedPanel(self):
    global toolbarZ
    self.toolbarZ = Frame(m1,bd=20, relief='flat', width=400)                                                            
    self.toolbarZ.grid()
    self.toolbarZ.place(x=1, y=850, anchor=W)

def zcgaPanel(self):
    global toolbarZcga
    self.toolbarZcga = Frame(m1,bd=20, relief='flat', width=400)
    self.toolbarZcga.grid()
    self.toolbarZcga.place(x=1, y=850, anchor=W)  

def zdraPanel(self):
    global toolbarZdra       
    self.toolbarZdra = Frame(m1,bd=20, relief='flat', width=400)
    self.toolbarZdra.grid()
    self.toolbarZdra.place(x=1, y=872, anchor=W)

上面的三个功能通过按钮调用帧。 我用来在它们之间切换的功能是:

 def selected(self):
    global toolbarZdra
    global toolbarZcga
    global toolbarZ
    global radioVar

    if radioVar.get()==1:
        self.toolbarZcga.grid_forget()
        self.toolbarZdra.grid_forget()
        self.zedPanel()

    elif radioVar.get()==2:
        self.toolbarZ.grid_forget()
        self.toolbarZdra.grid_forget()
        self.zcgaPanel()


    else:
        self.toolbarZcga.grid_forget()
        self.toolbarZ.grid_forget()
        self.zdraPanel()

我想要做的是在点击第三个按钮时消除其他两个帧。

我得到的错误是

AttributeError:示例实例没有属性'toolbarZcga'

其中示例是该类的名称。

我做错了什么?

4 个答案:

答案 0 :(得分:1)

我认为,当您将工具栏声明为更早于全局时,它们不是示例 -Object的属性。因此self.toolbarZcga应该是toolbarZcga,因为全局变量没有链接到您当前的对象。

答案 1 :(得分:1)

不要一起使用地点和网格。使用像网格这样的几何管理器的全部意义在于,您不必明确地放置小部件。我不能确切地说出发生了什么,因为我从来没有使用过地方,但我猜你做完之后

self.toolbarZcga.grid()
self.toolbarZcga.place(x=1, y=850, anchor=W)

toolbarZcga不再由网格管理,因此忘记它无效。您的网格应该是按行和列排列的单元格表;然后你只需将你的小部件网格化在适当的单元格中关于如何使用网格by John Shipman

,有一个非常好的介绍性解释

答案 2 :(得分:0)

嗯:你使用:

self.toolbarZcga.grid()
self.toolbarZcga.place(x=1, y=850, anchor=W)

然后你尝试删除网格!但是你使用了place

self.toolbarZ.grid_forget()
self.toolbarZdra.grid_forget()

我无法工作:你必须这样做:

self.toolbarZ.place_forget()
self.toolbarZdra.place_forget()

实际上,grid,place和pack是三个独有的(用于一个小部件)方法来管理依赖于它的其他小部件的定位!
tkinter的WM(窗口管理器)只为每个窗口小部件提供一种可能性:使用框架,您可以选择其中一个(网格,位置,打包)来定位后续(从属)窗口小部件。但是另一个小部件(可能取决于框架)可以有不同的小部件! 但对于我的框架:你不能使用网格作为一个依赖小部件并放置另一个,因为它混淆了WM!
你看???

答案 3 :(得分:0)

你有两个问题。第一个是错误消息告诉您的内容:您尝试使用名为toolbarZcga的属性,但该对象没有这样的属性。你有一个具有该名称的全局变量。您需要保持一致,并使用实例变量或全局变量。混合它们没有意义。在任何地方都使用self.toolbarZcga,或在任何地方使用toolbarZcga

第二个问题是您同时使用gridplace。当您致电grid后跟place时,地点会将控件从grid移开,这意味着grid_forget()将不再执行任何操作,因为grid无法控制小部件。您只能为每个窗口小部件使用gridpackplace之一,而您使用的最后一个窗口是控制窗口小部件的窗口。