python - 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()
解决方案
我查看了底层 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"
将网格单元留空,"-"
将小部件的列跨度增加到左侧,"^"
增加上方小部件的行跨度。
推荐阅读
- python - 如何使我的所有小部件具有相同的长度
- php - 向查询添加范围以根据首字母获取帖子
- sql - 如何将特定列值转换为 SQL 中一组值的标题?
- mysql - 在 MySQL 中为单行插入语句获取自动递增值
- .htaccess - 使用 htaccess 将移动设备 example.com 重定向到 example.com/m
- mongodb - 使用 $(update) 更新许多
- sql - 如何使用 SQL 查询查看带有 group by 子句的逗号分隔字符串中的列值?
- serialization - 如何以人类可读的方式在嵌套对象中记录 Protobuf 字符串?
- php - 无法使用 shell_exec 进行复制
- r - 如何在R中的“”之间提取字符串?