如何在已经打包到左侧的现有小部件下面打包tkinter小部件?

Bry*_*mas 9 python tkinter widget pack

我正在尝试编写一个基本的Tkinter GUI,Text其顶部有一个小部件,然后是一个Button小部件,在它Text下面对齐,然后是按钮下面的另一个小部件.我遇到的问题是,在将Button小部件打包到左侧之后,当我再打包第二Text个小部件时,它将它放在右侧的按钮旁边,而不是按钮下面.无论我side为第二Text个小部件设置参数,都会发生这种情况.这是一段演示此行为的简单代码:

from Tkinter import *

root = Tk()

w = Text(root)
w.pack()

x = Button(root, text="Hi there!")
x.pack(side=LEFT)

y = Text(root)
y.pack(side=BOTTOM)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

那么我将如何设置第二Text个小部件,使其显示在按钮下方而不是右侧?

Bry*_*ley 15

布局问题通常有两种解决方案:

  1. 切换到使用网格.像你想要完成的那样做布局真的很容易.网格可以解决所有布局问题的95%(当你想到它时,这是惊人的 - Tk与一位经理一起做大多数工具包需要六个人来完成!)

  2. 使用多个帧.如果某些小部件需要从上到下堆叠,而某些小部件需要从左到右堆叠,您无法始终获得所需的内容,将所有内容打包在一个框架中.对于布局的从上到下部分使用一个框架,对于从左到右的内容使用附加框架.

还要意识到小部件不一定是打包/网格化的小部件的子节点.您可以使用"in"参数将窗口小部件放在除父窗口之外的其他容器中.

例如,在您的特定示例中,您可以创建三个框架,顶部,中部,底部.在顶层窗口中将这些从上到下打包.然后,您可以将顶部的第一个文本小部件,中间的水平按钮或按钮打包,并将底部的另一个文本小部件打包.

这种方法的优势在于它使未来更改布局变得更加容易(根据我的经验总是在某些时候发生).您不必重新设置任何窗口小部件,只需在其他容器中打包/放置/网格化即可.

在您的简短示例中,它没有太大区别,但对于复杂的应用程序,这种策略可以节省生命.

我最好的建议是:布局不是事后的想法.做一点计划,甚至花五分钟画一些方格纸.首先确定应用程序的主要区域,并为每个区域使用框架或其他容器(paned窗口,笔记本等).一旦你拥有了这些,就为每个部分做同样的分而治之的方法.这使您可以为应用的不同部分使用不同类型的布局.工具栏获得水平布局,表单可能获得垂直布局等.


Bry*_*mas 8

我最初误解了包装是如何工作的,并没有意识到当我这样做时,整个左侧都被"声称"了x.pack(side=LEFT).我在阅读本文后得到的结果以及亚历克斯的回答是,我根本不是在完全x打包到左侧,而是将其固定在左侧,使用anchor=W(W代表西方)代替side=LEFT.我修改后的代码片段完成了我的工作,如下所示:

from Tkinter import *

root = Tk()

w = Text(root)
w.pack()

x = Button(root, text="Hi there!")
x.pack(anchor=W)

y = Text(root)
y.pack(side=BOTTOM)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

这种方式x不再"声称"左侧,它只是在其空间块内与左侧(或西侧)对齐.