首页 > 解决方案 > Tkinter 网格:将当前行上的新列用于新小部件

问题描述

我使用 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() 

标签: pythontkintertkinter-layout

解决方案


我查看了底层 Tkgrid命令的文档,它使用起来比提供的 Python 包装器方便得多,因为您可以一次在多个小部件上调用它(在这种情况下,它们在新的排)。您几乎不需要提供明确的行号或列号。这是一个如何grid在 Python 中使用这种样式的示例:

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"将网格单元留空,"-"将小部件的列跨度增加到左侧,"^"增加上方小部件的行跨度。


推荐阅读