【问题标题】:Tkinter grid: Use new column on current row for new widgetTkinter 网格:将当前行上的新列用于新小部件
【发布时间】:2021-03-17 16:10:55
【问题描述】:

我使用 Tkinter 在 Python3 中编写了一个 GUI,并使用 .grid() 放置小部件。我如何告诉 Tkinter 将新的小部件放置在与最后放置的小部件相同的行上,但放在新的指定列上。问题是,当我没有指定行并且我不想硬编码行号或使用行计数器污染我的代码时,Tkinter 会自动使用下一行,每次我在列中插入小部件时我都必须递增该行计数器0.

我尝试了什么:

#!/usr/bin/env python3
from tkinter import *
root=Tk()
Label(root, text="Label 0").grid(column=0)
Label(root, text="Label 1").grid(column=1)
Label(root, text="Label 2").grid(column=0)
Label(root, text="Label 3").grid(column=1)
Label(root, text="Label 4").grid(column=0)
Label(root, text="Label 5").grid(column=1)
root.mainloop()

布局的样子

Label 0
        Label 1
Label 2
        Label 3
Label 3
        Label 5

布局应该是什么样子的

Label 0 Label 1
Label 2 Label 3
Label 3 Label 5

我不想要的

可以通过指定列号来实现正确的布局,像这样:

#!/usr/bin/env python3
from tkinter import *
root=Tk()
Label(root, text="Label 0").grid(column=0,row=0)
Label(root, text="Label 1").grid(column=1,row=0)
Label(root, text="Label 2").grid(column=0,row=1)
Label(root, text="Label 3").grid(column=1,row=1)
Label(root, text="Label 4").grid(column=0,row=2)
Label(root, text="Label 5").grid(column=1,row=2)
root.mainloop()

但这并不灵活,在第二行插入一些内容意味着必须更改所有后续行的代码。添加行计数器是可能的,但这很容易出错,因为很容易忘记增加计数器。有没有办法在与最后插入的小部件在同一行的第二列中插入一个新小部件,而无需硬编码或跟踪最后一个行号?

或者是否有一个函数可以返回最后插入的小部件的行?所以我可以这样做:

#!/usr/bin/env python3
from tkinter import *
root=Tk()
Label(root, text="Label 0").grid(column=0)
Label(root, text="Label 1").grid(column=1,row=<root.unknowFunctionToGetTheLastInsertedRow>)
Label(root, text="Label 2").grid(column=0)
Label(root, text="Label 3").grid(column=1,row=<root.unknowFunctionToGetTheLastInsertedRow>)
Label(root, text="Label 4").grid(column=0)
Label(root, text="Label 5").grid(column=1,row=<root.unknowFunctionToGetTheLastInsertedRow>)
root.mainloop() 

【问题讨论】:

    标签: python tkinter tkinter-layout


    【解决方案1】:

    我查看了底层 Tk grid 命令的文档,它非常比提供的 Python 包装器更方便使用,因为您可以一次在多个小部件上调用它(在这种情况下,它们在新行中被赋予连续的列号)。您几乎不需要提供明确的行号或列号。下面是一个示例,说明如何在 Python 中以这种风格使用 grid

    from tkinter import *
    root=Tk()
    root.tk.call('grid',
        Label(root, text="Label 0"),
        Label(root, text="Label 1")
    )
    root.tk.call('grid',
        Label(root, text="Label 2"),
        Label(root, text="Label 3")
    )
    root.tk.call('grid',
        Label(root, text="Label 4"),
        Label(root, text="Label 5")
    )
    root.mainloop() 
    

    以这种方式使用时,您可以传递给grid 的其他选项:"x" 将网格单元留空,"-" 将小部件的列向左增加,"^" 增加小部件的行跨度以上。

    【讨论】:

    • 虽然我认为底层 grid 命令比 python 包装器更强大是对的,但您的示例似乎非常令人困惑。您将每一列显示为一行,这使得通过查看代码来可视化布局变得非常困难。如果视觉上并排的项目在代码中也并排显示会更好。
    • @BryanOakley,我明白你的意思,但我认为大多数现实世界的小部件都会有足够的选项指定,你不能在一条线上放置多个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2023-04-03
    • 2018-08-06
    • 2015-06-06
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多