Tkinter 打包方法混乱

2023-11-22

我不明白为什么包管理器不允许您将左和右打包在顶部打包的小部件下方。我的以下代码的预期输出是

 A
 B
C D 
 E

但它只显示:

 A
 B
C D
import tkinter as tk

root = tk.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.state('zoomed')
root.geometry("%dx%d+0+0" % (w-15, h-75))
A = tk.LabelFrame(root,text='A', bd=2)
B = tk.LabelFrame(root,text='B', bd=2)
C = tk.LabelFrame(root,text='C', bd=2)
D = tk.LabelFrame(root,text='D', bd=2)
E = tk.LabelFrame(root,text='E', bd=2)

A.pack(fill=tk.BOTH, expand=tk.TRUE)
B.pack(fill=tk.BOTH, expand=tk.TRUE)
C.pack(side=tk.LEFT,fill=tk.BOTH, expand=tk.TRUE)
D.pack(side=tk.RIGHT,fill=tk.BOTH, expand=tk.TRUE)
E.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.TRUE)

root.mainloop()

简而言之,打包程序并不是为了直接创建您要创建的布局而设计的。您可以做到,但需要一些额外的框架。在这种特殊情况下,您显然正在尝试创建一个网格,grid可以说是更好的选择。

在解释为什么会这样之前,让我提出一个解决方案。创建另一个名为“CD”的框架,用于容纳两者C and D。然后就可以打包了C向左和D到右边,然后把这个框架放在下面B。这就是您使用加壳器获得所需结果的方式。

A = tk.LabelFrame(root,text='A', bd=2)
B = tk.LabelFrame(root,text='B', bd=2)
CD = tk.Frame(root)
C = tk.LabelFrame(CD,text='C', bd=2)
D = tk.LabelFrame(CD,text='D', bd=2)
E = tk.LabelFrame(root,text='E', bd=2)

C.pack(side=tk.LEFT,fill=tk.BOTH, expand=tk.TRUE)
D.pack(side=tk.RIGHT,fill=tk.BOTH, expand=tk.TRUE)

A.pack(fill=tk.BOTH, expand=tk.TRUE)
B.pack(fill=tk.BOTH, expand=tk.TRUE)
CD.pack(fill=tk.BOTH, expand=tk.TRUE)
E.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.TRUE)

解释一下打包机

加壳器的工作原理是沿着未分配空间的一侧保留一块空间。当将小部件打包到顶部或底部时,此分配的空间会占用未分配空间的整个宽度,并且在左侧或右侧打包时会占用整个高度。这是一个重要的细节。

让我尝试用一​​些屏幕截图来描述它。在所有情况下,以下屏幕截图均不显示帧,而是显示加壳程序管理的已分配和未分配空间量。

当你打包时A沿着顶部(如果不指定边,则默认为顶部),为根窗口的整个宽度保留一块空间。因为你把它挤到了顶部,所以唯一剩下的空间就在下面A。左边或右边不能装任何东西A从现在开始。

(实际上,您可以使用一些高级选项将内容放在左侧或右侧,但这超出了本描述的范围)

available space after A

当你沿着顶部包装B时,唯一可用的空间在下面A。再说一次,因为你把它沿着顶部包装,包装后B现在唯一可用的可用空间将在下面B.

available space after B

当你打包时C沿着左边,为剩余空间的整个高度保留一块空间。这意味着下面不能放置任何内容C。所有剩余空间都在右侧C,以及以下B.

available space after C

  1. 当你打包时D,它必须位于右侧C及以下B。因为你把它放在右边,所以它会保留上面和下面所有剩余的垂直空间D.

available space after D

当你打包时E沿着底部,它唯一能去的地方就是下面B, 在 - 的右边C,以及左边D.

available space after E

由于打包程序沿着一侧分配所有空间的性质,因此当所有小部件都放置在同一轴上(垂直或水平堆叠)时,打包程序效果最佳。当你想像下面那样切换轴时C and D,通常最好将它们放在单独的框架内。在该框架内,您可以从左到右放置小部件,但该框架可以像其他小部件一样保留在从上到下的轴上。

注意:这是您的代码中实际发生的情况:E被挤压在之间C and D。由于各种原因它是不可见的,但是如果你给它一个明确的大小和颜色,那么它就会显示出来。

了解更多信息

加壳算法的权威描述可以在tcl/tk 包的手册页.

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

Tkinter 打包方法混乱 的相关文章

随机推荐

  • 使用 IDataReader 作为 IEnumerable 的最佳方法?

    我需要使用Linq on any 数据读取器像这样的实现 var c sqlDataReader AsEnumerable Count Example public abstract class Test public abstract S
  • 将数组拆分为唯一的对

    假设我从一个简单的数组开始 理论上可以是任意长度 ids array 1 2 3 4 将这个数组拆分为一组唯一对的数组的最佳解决方案是什么 例如 pair 0 array 1 2 pair 1 array 1 3 pair 2 array
  • 使用 Laravel Eloquent 直接增加或减少列中的数字更新

    我有一个查询 我在哪里使用 Eloquent 来查找 ID 但我需要的是直接在 eloquent 查询中减去 与查询生成器中相同 文档代码 flight App Flight find 1 flight gt name New Flight
  • FirebaseMLVisionTextModel 已被弃用,取而代之的是 MLKitTextRecognition

    我正在使用 Firebase MLKit TextRecognition API 尝试更新时出现警告 pod Firebase MLVisionTextModel 如何更新 Firebase MLKit 库 FirebaseMLVision
  • 如何按嵌套值对 JSON 对象进行排序?

    我有一个 ajax 调用 它返回一个非常复杂的 JSON 对象 并且我很难对其进行排序 My call post reports ajax arguments function data 响应 10001 unitname Fort Wor
  • 为什么 Rust 中的 const 函数不能调用关联函数?

    This const fn pow2 exp u32 gt u32 u32 pow exp 2 导致编译器错误 error E0015 calls in constant functions are limited to constant
  • 隐藏 ListBox 控件中的垂直滚动条

    我正在开发一个应用程序 需要ListBox控制 不幸的是 当我在中添加太多项目时ListBox 显示垂直滚动条 我可以做些什么来隐藏显示的垂直滚动条ListBox 我可以看到有一个隐藏水平滚动条的属性 但没有垂直滚动条的属性 问题解决了 我
  • 如何在 .NET 类库中创建“抽象”枚举?

    我正在制作一个服务器库 其中数据包关联是通过枚举完成的 public enum ServerOperationCode byte LoginResponse 0x00 SelectionResponse 0x01 BlahBlahRespo
  • Python:数据与文本?

    Guido van Rossum 的演讲蟒蛇3000提到了一些最终可以让从 Python 2 过渡到 Python 3 更容易的事情 他专门讨论了文本处理 因为将 Unicode 作为 Python 3 中字符串的唯一表示形式是主要变化之一
  • UPDATE 锁如何防止常见形式的死锁?

    The SQL Server 在线书籍比如说UPDATE锁可以防止常见形式的死锁 更新锁 更新 U 锁可防止常见形式的死锁 他们如何防止常见形式的僵局 我这么说是什么意思 死锁的一种常见形式是两个进程尝试从共享 S 锁升级 即读锁 到独占
  • 将边框应用于 Chrome 中的复选框

    我的网站上有很多表格 当然 其中的许多字段都是必需的 如果必填字段留空 则会为其分配一个 错误 类 并且我尝试用红色圈出该字段 无论它是文本字段 下拉菜单还是复选框 我的 css 文件中有以下代码 error input error sel
  • 从 SQL 查询到应用程序代码的回溯?

    有没有办法在 Rails 开发日志中找到哪一行代码生成了 MySQL 语句 为了进行一些性能优化 我想找到我的应用程序的哪个部分正在创建哪些 MySQL 查询 当我查看日志时 我看到我所做的每个网络请求上都会闪烁数百个查询 我需要找出它们来
  • CoffeeScript 中的命名空间

    我想像在 javascript 中那样使用关键字 with 来使用命名空间 但是 CoffeeScript 将此报告为保留关键字并拒绝编译 有什么方法可以在 cs 中使用命名空间吗 特别是 我想动态包含 CoffeeScript 文件 受信
  • Angular 2:在注入 Router 之前引导至少一个组件

    我在 RC5 应用程序中收到此错误 Promise 拒绝 在注入 Router 之前引导至少一个组件 main ts import platformBrowserDynamic from angular platform browser d
  • 如何让 Visual Studio 2015 xproject (project.json) 引用依赖项目的最高框架

    我正在创建一个针对多个平台 NET 4 0 NET 4 5 NETStandard 1 0 和 NETStandard 1 3 的可重用库 该项目的 NET 4 5 版本包含一些 NET 4 0 版本下不可用的功能 引用该库项目的单元测试项
  • 如何在 Next.js 中向 Jest 测试添加模块别名?

    目前我在 Next js 项目中使用自动导入 配置如下jsconfig json在根目录中 typeAcquisition include jest compilerOptions baseUrl paths components comp
  • Swift 可编码不同的数组类型

    我正在编写一个正在解析的程序JSON包含数组数组的数据 其中嵌套数组具有不同的对象类型 具体来说 String String Int 例如 number 5295 bets 16 83 9 75 99 4 46 27 5 我正在尝试使用可编
  • backbone.js ajax 调用

    我正在为我正在构建的新应用程序学习 Backbone js 我需要执行 AJAX 调用 REST SERVICE 进行身份验证 此调用的正确位置在哪里 在模型 视图还是其他地方 特别与 Backbone js MVC 模型相关
  • 禁用单页应用程序的浏览器后退按钮

    我需要在单页应用程序中禁用浏览器的后退按钮 我尝试使用类似的方法哈希变化 or window history forward但它们不起作用 原因可能是 url 没有在这里更改 我在 AngularJS 中工作 构建一个单页应用程序 我想禁用
  • Tkinter 打包方法混乱

    我不明白为什么包管理器不允许您将左和右打包在顶部打包的小部件下方 我的以下代码的预期输出是 A B C D E 但它只显示 A B C D import tkinter as tk root tk Tk w h root winfo scr