Python 使用grid_forget()时帧不会消失-Tkinter
我在Tkinter中使用单选按钮在帧之间切换,使用grid_forget(),正如在另一个问题中建议的那样,与在帧之间切换有关,但由于某些原因,旧帧不会消失 以下是我的代码的一些摘录: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)
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(在同一个小部件中)。是一个,还是另一个!