Tkinter配置列宽

时间:2012-12-26 19:30:29

标签: python tkinter

我在文档中找到了3个可行的选项:

  • MINSIZE
  • 重量

但是如果你想让列尽可能小呢?

我有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列时,它们会分开太多: - ()

致以最诚挚的问候,

卡斯帕

1 个答案:

答案 0 :(得分:8)

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

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

在我谈论解决方案之前,让我确保你清楚地知道你使用网格将多个小部件放在同一个单元格中的方式绝对是错误的方法。绝对没有理由采用这样的解决方案。一般的经验法则是,您不应该在单元格中放置多个小部件。

最简单的解决方案是组合网格和包。将所有支票按钮放在一个框架中,并将它们打包在该框架的左侧。然后,使用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()

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