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,text="Label 2").grid(column=0,row=1)
Label(root,text="Label 3").grid(column=1,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,row=<root.unkNowFunctionToGetTheLastInsertedRow>)
Label(root,row=<root.unkNowFunctionToGetTheLastInsertedRow>)
root.mainloop() 

解决方法

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

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

enter image description here

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