如何在 Tkinter 中切换到不同的框架? [复制]

Posted

技术标签:

【中文标题】如何在 Tkinter 中切换到不同的框架? [复制]【英文标题】:How to switch to a different frame in Tkinter? [duplicate] 【发布时间】:2012-07-15 05:49:20 【问题描述】:

我目前正在开发一个使用 Python 中的 Tkinter 模块的项目。我正在使用菜单小部件,菜单上的每个命令都有另一个与之关联的命令。这些命令中的每一个都会打开一个新框架。我正在使用网格几何管理器。

我的问题是我希望用户能够从一个帧切换到另一个帧,但是当我尝试这样做时,这些帧彼此重叠而不是切换。如何让活动框架隐藏然后打开一个新框架?我不想遍历可能的帧列表并告诉它们全部隐藏。

这是我目前写的代码:

import Tkinter as tkinter
root = tkinter.Tk()
root.minsize(400,300)
welcome = tkinter.Frame(root).grid()
label = tkinter.Label(welcome, text="Welcome to my program").grid(row=0, column=3)
button = tkinter.Button(welcome,text="Exit",command=root.destroy).grid(row=3, column=1)
def newFrame():
        newFrame = tkinter.Frame(root).grid()
        newFrame_name = tkinter.Label(newFrame, text="This is another frame").grid()
menu = tkinter.Menu(root)
root.config(menu=menu)

main_menu = tkinter.Menu(menu)
menu.add_cascade(label="Main Menu", menu= main_menu)
main_menu.add_command(label="New Frame", command=newFrame)

#menu.add_command(label="Exit", command=root.destroy, menu= filemenu)


root.mainloop()

当用户从菜单中选择新框架选项时,我希望新框架替换欢迎框架。

【问题讨论】:

【参考方案1】:

如果您使用placegrid 将帧堆叠在一起,您可以使用lift 方法简单地更改堆叠顺序。

【讨论】:

我已经尝试过了,但我一直收到错误消息,提示“NoneType”对象没有名为“lift”的属性。另外,提升方法会清除所有其他可见的帧,还是只会提升我选择的一个特定帧? @juleszero: lift 只会提升一帧。至于 NoneType 错误,只需问自己“为什么这个对象设置为 None?”。我的猜测是你正在做这样的事情:frame=Frame(...).grid(...),这导致frame 为无。底线是,您的代码中有一个错误导致您在设置为 None 的变量上调用 lift。由于您尚未发布任何代码,因此无法更具体。 这正是我设置所有框架的方式!我不知道它导致对象被设置为“无”。我已经用我的代码更新了我的帖子,希望能有所帮助。 @juleszero:当您调用.pack().grid() 时,这些函数会返回None,这就是为什么您所有的小部件引用都是None。不幸的是,一些在线教程教你这样做,但这是一种不好的做法。我建议您始终将布局代码与小部件创建代码分开。 能否请您提供一个示例来说明您的意思,并可能提供一些正确的教程?

以上是关于如何在 Tkinter 中切换到不同的框架? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Tkinter 中切换帧时出错

我如何使用python将终端输出到网格中的tkinter框架?

展开 Tkinter 框架

如何在粘性框架中居中 tkinter 小部件

使用 Tkinter 中的菜单栏在页面之间切换

tkinter - 使用按钮在帧之间来回切换