tkinter 中的框架未彼此堆叠

2024-04-06

我在 tkinter 中将“页面”堆叠在一起时遇到问题。

我有一个主Frame包含两个子帧,两个子帧都包含不同的信息。第一个子帧包含Listbox和几个按钮,位于主框架的左侧。第二个框架应该包含不同的“页面”(现在有两个)并让它们填满整个框架。 我的问题是两个“页面”并排显示,而不是彼此重叠。

import tkinter as tk


class Settings(tk.Tk):

    def __init__(self, master=None):
        tk.Tk.__init__(self, master)
        self.focus_force()
        self.grab_set()
        # set focus to settings window
        # Main window title
        self.title("Settings")


        # set up grid containers
        container_main = tk.Frame(self, width=500, height=700)
        container_main.pack(side='top', fill='both', expand=True)
        container_main.grid_rowconfigure(0, weight=1)
        container_main.grid_columnconfigure(0, weight=1)

        container_listbox = tk.Frame(container_main, bg='blue', width=200, height=700)
        container_listbox.pack(side='left', fill='both', expand=True)
        container_listbox.grid_rowconfigure(0, weight=1)
        container_listbox.grid_columnconfigure(0, weight=1)

        container_settings = tk.Frame(container_main, bg='red', width=300, height=700)
        container_settings.pack(side='right', fill='both', expand=True)
        container_settings.grid_rowconfigure(0, weight=1)
        container_settings.grid_columnconfigure(0, weight=1)

        # build settings pages
        self.frames = {}

        self.frames["Options"] = Options(parent=container_listbox, controller=self)
        self.frames["General"] = General(parent=container_settings, controller=self)
        self.frames["Future"] = Future(parent=container_settings, controller=self)

如果我取消注释这两行。我收到一条错误消息,说我无法在内部使用几何管理器网格。

        # self.frames["General"].grid(row=0, column=0, sticky='nsew')
        # self.frames["Future"].grid(row=0, column=0, sticky='nsew')

.

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()


class Options(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(parent, text='List Box')
        label.grid(row=0, column=0, sticky='nsew', padx=1, pady=1)
        button1 = tk.Button(parent, text='General', command=lambda: controller.show_frame('General'))
        button2 = tk.Button(parent, text='Future', command=lambda: controller.show_frame('Future'))
        button1.grid(row=1, column=0, sticky='ew')
        button2.grid(row=2, column=0, sticky='ew')


class General(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(parent, text='General')
        label.pack(side='left', fill='both', expand=True, )
        print("Hi I'm General")

class Future(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(parent, text='Future')
        label.pack(side='left', fill='both', expand=True)
        print("Hi I'm Future")

app = Settings()
app.mainloop()

两个“页面”同时初始化并显示,这是有道理的。我只是不知道如何让其中一个超越另一个frame.tkraise()应该这样做,但没有。我也希望能够做到grid_forget()位于不在顶部的一个或多个页面上,以避免将来可能意外地将值输入到隐藏的输入框中。

编辑:如果我注释掉“未来”页面,那么“常规”页面将占据整个框架空间,因此grid_forget()我会得到同样的结果。我只是不知道我会去哪里但是grid_forget()然后我还要在哪里重新配置或执行grid() call?


我的问题是两个“页面”并排显示,而不是彼此重叠。

如果你使用pack()在根窗口上放置一个框架,然后使用grid()在该框架内,那么它会起作用,但是如果您尝试使用pack()框架内部,然后尝试使用grid()在同一框架内它将失败。

根窗口和框架也是如此。如果pack()根窗口中的框架,那么您无法使用grid()将任何内容放入同一个根窗口中。

问题与grid() vs pack()问题是因为上课的地点General和班级Future正在配置标签小部件是父框架,其中pack()正在被使用。这阻止了使用grid()在同一个父框架中放置常规框架和未来框架。

为了解决这个问题,我们改变:

label = tk.Label(parent, text='General')

and

label = tk.Label(parent, text='Future')

to:

label = tk.Label(self, text='General')

and

label = tk.Label(self, text='Future')

上述是使其正常工作所需的唯一修复。

import tkinter as tk


class Settings(tk.Tk):

    def __init__(self, master=None):
        tk.Tk.__init__(self, master)
        self.focus_force()
        self.grab_set()
        # set focus to settings window
        # Main window title
        self.title("Settings")

        container_main = tk.Frame(self, width=500, height=700)
        container_main.pack(side='top', fill='both', expand=True)
        container_main.grid_rowconfigure(0, weight=1)
        container_main.grid_columnconfigure(0, weight=1)

        container_listbox = tk.Frame(container_main, bg='blue', width=200, height=700)
        container_listbox.pack(side='left', fill='both', expand=True)
        container_listbox.grid_rowconfigure(0, weight=1)
        container_listbox.grid_columnconfigure(0, weight=1)

        container_settings = tk.Frame(container_main, bg='red', width=300, height=700)
        container_settings.pack(side='right', fill='both', expand=True)
        container_settings.grid_rowconfigure(0, weight=1)
        container_settings.grid_columnconfigure(0, weight=1)

        self.frames = {}

        self.frames["Options"] = Options(parent=container_listbox, controller=self)
        self.frames["General"] = General(parent=container_settings, controller=self)
        self.frames["Future"] = Future(parent=container_settings, controller=self)   


        self.frames["General"].grid(row=0, column=0, sticky='nsew')
        self.frames["Future"].grid(row=0, column=0, sticky='nsew')

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

class Options(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(parent, text='List Box')
        label.grid(row=0, column=0, sticky='nsew', padx=1, pady=1)
        button1 = tk.Button(parent, text='General', command=lambda: controller.show_frame('General'))
        button2 = tk.Button(parent, text='Future', command=lambda: controller.show_frame('Future'))
        button1.grid(row=1, column=0, sticky='ew')
        button2.grid(row=2, column=0, sticky='ew')


class General(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text='General')
        label.pack(side='left', fill='both', expand=True)
        print("Hi I'm General")

class Future(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text='Future')
        label.pack(side='left', fill='both', expand=True)
        print("Hi I'm Future")

app = Settings()
app.mainloop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tkinter 中的框架未彼此堆叠 的相关文章

  • Python 3 os.urandom

    在哪里可以找到完整的教程或文档os urandom 我需要获得一个随机 int 来从 80 个字符的字符串中选择一个字符 如果你只需要一个随机整数 你可以使用random randint a b 来自随机模块 http docs pytho
  • 使用 python 中的公式函数使从 Excel 中提取的值的百分比相等

    import xlrd numpy excel Users Bob Desktop wb1 xlrd open workbook excel assignment3 xlsx sh1 wb1 sheet by index 0 colA co
  • 如何检查python xlrd库中的excel文件是否有效

    有什么办法与xlrd库来检查您使用的文件是否是有效的 Excel 文件 我知道还有其他库可以检查文件头 我可以使用文件扩展名检查 但为了多平台性我想知道是否有任何我可以使用的功能xlrd库本身在尝试打开文件时可能会返回类似 false 的内
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • Django 的 request.FILES 出现 UnicodeDecodeError

    我在视图调用中有以下代码 def view request body u for filename f in request FILES items body body Filename filename n f read n 在某些情况下
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • Django Admin 中的反向内联

    我有以下 2 个型号 现在我需要将模型 A 内联到模型 B 的页面上 模型 py class A models Model name models CharField max length 50 class B models Model n
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • 如何根据第一列创建新列,同时考虑Python Pandas中字母和列表的大小? [复制]

    这个问题在这里已经有答案了 我在 Python Pandas 中有 DataFrame 如下所示 col1 John Simon prd agc Ann White BeN and Ann bad list Ben Wayne 我需要这样做
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud

随机推荐

  • Django 和 uWSGI 的内部服务器错误

    我正在尝试按照本指南中的步骤操作 http uwsgi docs readthedocs org en latest tutorials Django and nginx html http uwsgi docs readthedocs o
  • 如果不需要的话 CSS 隐藏滚动条

    我正在尝试找出如何隐藏overflow y scroll 如果不需要 我的意思是 我正在构建一个网站 我有一个将显示帖子的主要区域 如果内容不超过当前宽度 我想隐藏滚动条 另外 我的第二个问题 我想做到这一点 以便当帖子超过当前宽度时 宽度
  • 将清单嵌入到 exe 文件中

    我有一个 manifest链接到的文件 exe程序文件 以便在打开时要求管理员权限 现在它是一个单独的文件 名为program name exe manifest这是与以下相同的文件夹program name exe 有什么方法可以将清单文
  • 通过宏/环境变量定义解决方案中的项目路径

    有没有办法使用用户宏 环境变量在解决方案中定义项目文件路径 我似乎无法做到这一点 有点像环境变量用于定义 C 项目中的附加包含目录 但我想对解决方案中项目文件的位置执行相同的操作 我尝试在文本编辑器中编辑解决方案以更改以 MyMacroNa
  • Fiddler 不解压缩 gzip 响应

    I use Fiddler调试我的应用程序 每当服务器压缩响应而不是解压缩响应时 Fiddler 都会显示不可读的二进制数据 Response to my request POST HTTP 1 1 200 OK Server xyz co
  • linq to sql loadwith 与 Associatewith

    loadwith 和 Associatewith 之间有什么区别 从我读到的文章看来 loadwith 用于加载附加数据 例如客户的所有订单 而AssociateWith用于过滤数据 这是正确的理解吗 如果有人可以用基于示例的解释来解释这一
  • Laravel 4:发布包的资产

    如何发布包资源 我在这里找到了一个教程 http laravel recipes com recipes 279 http laravel recipes com recipes 279 但是当我尝试从工作台发布资产时 出现以下错误 Run
  • PHP、MySQL:接收电子邮件,在数据库中自动搜索并根据结果发送电子邮件

    访客可以通过联系表联系工作人员 访客还需要提交电子邮件 这将存储在数据库中 现在考虑到工作人员回复此消息 工作人员的回复将直接发送到访客的电子邮件中 假设用户想要跟进工作人员发送的消息 我希望访问者只需点击电子邮件服务中的回复按钮 然后向我
  • 标准化整数与浮点的转换

    我需要将标准化整数值与实际浮点值相互转换 例如 对于 int16 t 值 1 0 用 32767 表示 1 0 用 32768 表示 尽管对每个整数类型 有符号和无符号 执行此操作有点乏味 但手动编写仍然很容易 然而 我想尽可能使用标准方法
  • 增加 Java 中主题的分区数量

    我正在使用名称 卡夫卡 2 12版本 2 3 0 根据我想更改的流量 负载最大分区某个主题的编号 Kafka启动后是否可以进行这种更改 并且可以通过代码完成吗 是的 您可以通过代码增加分区 使用AdminClient createParti
  • Android 当主题为深色时更改品牌启动背景颜色

    我在我的应用程序中实现了深色主题 一切正常 当系统处于深色模式时 应用程序也处于深色模式 反之亦然 问题是品牌启动 我有 2 个可绘制文件 Dark
  • 如何使用 ruby​​ 通过 ssl 通过 smtp 发送邮件(不使用 Rails,gmail 没有 TLS)

    我想要的只是使用 SSL 通过 SMTP 从我的 ruby 脚本发送电子邮件 我只找到了从 Rails 或使用 TLS 的 Gmail 执行此操作的示例 我发现人们谈论 ruby 1 8 5 的 SMTPS 支持 但是libdoc http
  • 显示没有索引的 pandas 数据框

    我想在没有索引列的情况下显示此数据框 我正在使用制表模块来更好地可视化数据 但不想在这里看到索引 我在 dftabulate 中尝试了index False 但它不接受这个参数 import pandas as pd from tabula
  • 如何在 jasper 报告中将文本字段旋转 90 度?

    我正在使用 iReport 设计器创建一些报告 在生成报告时 我遇到一个要求 必须以 90 度旋转显示静态文本字段 标签 如下图所示 我在互联网上搜索以获得解决方案 我发现 jaspersoft 不支持文本字段旋转 我在解决方案中读到了这个
  • 从 Admin SDK 调用 Firebase Callable Cloud 函数

    我有一个 Firebase 云函数 我想创建一个可调用函数 以便我可以从内置身份验证的 Web 客户端调用它 但我也想使用 Admin SDK 从我自己的后端代码调用它 特别是来自 Java 如果这很重要的话 我看到协议已记录 https
  • 在 Android 中的 Fragment 中使用 Google 地图

    我正在尝试在片段中加载 Google 地图 无论我尝试实现什么解决方案 我都会不断收到相同的错误 我已经解决了所有类似 如果不相同 的问题 并尝试按照前几个最佳答案的建议进行操作 但遗憾的是没有运气 因此 如果您能帮助我 我将不胜感激 我的
  • java 中像 read() 这样的 I/O 方法如何将线程置于阻塞状态?

    因此 如果我理解正确的话 当我们对对象调用 wait 时 线程会进入等待状态 而当它等待对象上的锁时 例如尝试进入同步块或方法时 线程会进入阻塞状态 像 read 这样的 I O 方法如何将线程置于阻塞状态 我理解为什么它必须处于阻塞状态
  • OpenGL - 固定管线着色器默认值(使用着色器模仿固定管线)

    谁能给我提供类似于固定功能管道的着色器 我最需要默认的片段着色器 因为我在网上找到了类似的顶点着色器 但如果你有一双应该没问题 我想使用固定管道 但具有着色器的灵活性 因此我需要类似的着色器 以便我能够模仿固定管道的功能 非常感谢 我是新来
  • 基本 javascript 警报在英特尔 XDK 代码编辑器中不起作用

    我正在从一个新的空白英特尔项目开始 我什至还没有开始编码 我只是设置文件树并确保 html 和 javascript 页面通过正确的锚点和脚本路径连接 但我的第一个 js 文件无法工作 我提供了测试代码和错误的屏幕截图 我知道语法是正确的
  • tkinter 中的框架未彼此堆叠

    我在 tkinter 中将 页面 堆叠在一起时遇到问题 我有一个主Frame包含两个子帧 两个子帧都包含不同的信息 第一个子帧包含Listbox和几个按钮 位于主框架的左侧 第二个框架应该包含不同的 页面 现在有两个 并让它们填满整个框架