8

我一直在查看文档,并在 columnconfigure 中找到了 3 个可行的选项:

  • 缩小
  • 软垫
  • 重量

但是,如果您想让列尽可能小怎么办?

我有 3 个检查按钮,我想并排排列。

我发现工作是:

weekly.grid(row = 2, column = 1, sticky = W)
monthly.grid(row = 2, column = 1, padx = 75, sticky = W)
yearly.grid(row = 2, column = 1, padx = 150, sticky = W)

难道没有更“漂亮”的方式来做到这一点吗?

(可能值得一提的是,当使用第 2 列和第 3 列时,它们被分开太多了 :-()

最好的祝福,

卡斯帕

4

1 回答 1

12

使用网格几何管理器的默认行为是列将尽可能小,因此您不需要做任何事情(假设您正确使用网格)。

您描述的元素之间空间过大的行为可能是由于您在同一列中有其他更宽的小部件。该列将默认为可容纳最宽项目的最小宽度。那,或者在您的代码中的其他地方,您为导致它们扩展的某些列赋予非零权重。

在我谈论解决方案之前,让我确保您使用网格将多个小部件放在同一个单元格中的方式很明显是错误的方式。绝对没有理由诉诸这样的解决方案。一般的经验法则是,您永远不应该在一个单元格中放置多个小部件。

对您来说最简单的解决方案是结合 grid 和 pack。将所有复选按钮放在一个框架中,并将它们打包在该框架的左侧。然后,使用 . 将框架放入网格中sticky="w"。然后,无论窗口有多大,检查按钮都将始终粘在其包含框架的左侧。

请注意,此解决方案不会违反我之前提到的经验法则。您只需将一个小部件放在一个单元格中:框架。您可以在该内部框架中放置您想要的任何内容,但从网格的角度来看,网格的每个单元格中只有一个小部件。

这是一个基于 python 2.7 的工作示例:

import Tkinter as tk

class ExampleView(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        cbframe = tk.Frame(self)
        cb1 = tk.Checkbutton(cbframe, text="Choice 1")
        cb2 = tk.Checkbutton(cbframe, text="Choice 2")
        cb3 = tk.Checkbutton(cbframe, text="Choice 3")

        cb1.pack(side="left", fill=None, expand=False)
        cb2.pack(side="left", fill=None, expand=False)
        cb3.pack(side="left", fill=None, expand=False)

        # this entry is for illustrative purposes: it
        # will force column 2 to be widget than a checkbutton
        e1 = tk.Entry(self, width=20)
        e1.grid(row=1, column=1, sticky="ew")

        # place our frame of checkbuttons in the same column
        # as the entry widget. Because the checkbuttons are
        # packed in a frame, they will always be "stuck"
        # to the left side of the cell.
        cbframe.grid(row=2, column=1, sticky="w")

        # let column 1 expand and contract with the 
        # window, so you can see that the column grows
        # with the window, but that the checkbuttons
        # stay stuck to the left
        self.grid_columnconfigure(1, weight=1)

if __name__ == "__main__":
    root = tk.Tk()
    view = ExampleView(root)
    view.pack(side="top", fill="both", expand=True)
    root.wm_geometry("400x200")
    root.mainloop()

当然,您也可以将复选按钮放在单独的列中——这通常是最简单的——但您可能需要让其他行中的其他项目跨越多个列并处理列权重。由于根据您的描述尚不清楚您的问题究竟是什么,因此上述解决方案可能对您来说是最简单的。

于 2012-12-26T20:47:51.273 回答