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

Python 使用grid_forget()时帧不会消失-Tkinter,python,tkinter,Python,Tkinter,我在Tkinter中使用单选按钮在帧之间切换,使用grid_forget(),正如在另一个问题中建议的那样,与在帧之间切换有关,但由于某些原因,旧帧不会消失 以下是我的代码的一些摘录: def zedPanel(self): global toolbarZ self.toolbarZ = Frame(m1,bd=20, relief='flat', width=400)

我在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:示例实例没有属性“Toolbar ZCGA”

其中,Example是类的名称


我做错了什么?

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

不要同时使用place和grid。使用网格这样的几何体管理器的全部意义在于,您不必显式地放置小部件。我不知道到底发生了什么,因为我从来没用过这个地方,但我猜在你们用过之后

self.toolbarZcga.grid()
self.toolbarZcga.place(x=1, y=850, anchor=W)
工具栏ZCGA不再由gridder管理,因此忘记它没有任何效果。网格应该是一个按行和列排列的单元格表;然后,您只需在适当的单元格中网格化您的小部件。关于如何使用网格,有一个非常好的介绍性说明:您使用:

self.toolbarZcga.grid()
self.toolbarZcga.place(x=1, y=850, anchor=W)
然后尝试删除网格!但是您必须使用
位置

self.toolbarZ.grid_forget()
self.toolbarZdra.grid_forget()
我不能工作:你必须做:

self.toolbarZ.place_forget()
self.toolbarZdra.place_forget()
事实上,grid、place和pack是三种独占的(对于onewidget)方法,用于管理依赖于它的其他widget的定位
tkinter的WM(windows管理器)只允许每个小部件有一种可能性:使用一个框架,您选择其中一个(网格、位置、包)来定位后续(依赖)小部件。但是另一个小部件(可能取决于框架)可以有一个不同的小部件
但对于我的框架:您不能将网格用于依赖的小部件,而将place用于另一个小部件,因为它会混淆WM

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


第二个问题是您同时使用了
grid
place
。当您调用
grid
后接
place
时,place将控制权从
grid
移开,这意味着
grid\u-forget()
将不再执行任何操作,因为
grid
不控制小部件。每个小部件只能使用
grid
pack
place
中的一个,最后一个是控制小部件的小部件。

标题似乎与实际问题无关。我注释掉了self.toolbarZcga.place(x=1,y=850,anchor=W),但是它仍然不起作用。但是在你完成grid_forget()之后,你会再次调用zcgaPanel(),所以你会重新进行布局。像这样的事件驱动编程的工作方式是,首先执行一些函数来设置GUI(如zcgaPanel),然后将回调函数绑定到某些小部件以响应按钮单击之类的事件。因此,您需要一个回调函数,它不会忘记网格并绑定到单选按钮。你没有使用正确的方法。从做一些非常简单的事情开始。在屏幕上画一个蓝色正方形。制作一个按钮,单击时将颜色更改为红色。我尝试通过删除“self”来更改它,但它仍然不起作用。我收到的错误消息是:未定义全局名称“Toolbar ZCGA”。仍不工作。问题似乎在于没有正确声明我的变量-我一直得到的错误是:没有定义全局名称“toolbarZcga”。可能是:但是它无法声明一个
位置
并删除
网格
,不是吗?当然,您不能同时声明
grid
place
!!我明白了。我注释掉了位置声明,只留下了网格,但它似乎不起作用。另外,当我注释掉“place”时,我的框架移到了窗口的另一部分。为什么我不能同时使用place和grid?它们似乎在做不同的事情,“place”似乎在固定整个框架的位置,“grid”管理按钮的位置?@onetramp:是的!但是不能同时使用place和grid(在同一个小部件中)。是一个,还是另一个!