【问题标题】:Can you configure all minsize for row/column all at once?您可以一次为行/列配置所有 minsize 吗?
【发布时间】:2017-03-20 22:42:58
【问题描述】:

我有一个 tkinter 应用程序,我正在开发一个笔记召回工具。我的问题出在 .grid 布局中。我想知道是否有一种方法可以使用.columnconfigure().rowconfigure() 配置所有行和所有列的最小大小,使用范围之类的东西来定义所有行/列。现在我必须分别为每行和每列定义minsize=。似乎应该有一种更简单的方法来一次定义所有行/列。

这是我的代码

from tkinter import *
from tkinter.ttk import *
import tkinter.font
import subprocess as sub
import tkinter.messagebox


#~~~~~~~~~~~< spacer grid >~~~~~~~~~~~
spacerC0=Label(root, text="0").grid(row = 1, column = 0)
spacerC1=Label(root, text="1").grid(row = 1, column = 1)
spacerC2=Label(root, text="2").grid(row = 1, column = 2)
spacerC3=Label(root, text="3").grid(row = 1, column = 3)
spacerC4=Label(root, text="4").grid(row = 1, column = 4)
spacerC5=Label(root, text="5").grid(row = 1, column = 5)
spacerC6=Label(root, text="6").grid(row = 1, column = 6)
spacerC7=Label(root, text="7").grid(row = 1, column = 7)
spacerC8=Label(root, text="8").grid(row = 1, column = 8)
spacerC9=Label(root, text="9").grid(row = 1, column = 9)
root.columncel(root, text="0").grid(row = 1)
spacerR1=Label(root, text="1").grid(row = 2)
spacerR2=Label(root, text="2").grid(row = 3)
spacerR3=Label(root, text="3").grid(row = 4)
spacerR4=Label(root, text="4").grid(row = 5)
spacerR5=Label(root, text="5").grid(row = 6)
spacerR6=Label(root, text="6").grid(row = 7)
spacerR7=Label(root, text="7").grid(row = 8)
spacerR8=Label(root, text="8").grid(row = 9)
spacerR9=Label(root, text="9").grid(row = 10)
root.rowconfigure(0, minsize=60)
root.rowconfigure(1, minsize=60)
root.rowconfigure(2, minsize=60)
root.rowconfigure(3, minsize=60)
root.rowconfigure(4, minsize=60)
root.rowconfigure(5, minsize=60)
root.rowconfigure(6, minsize=60)
root.rowconfigure(7, minsize=60)
root.rowconfigure(8, minsize=60)
root.rowconfigure(9, minsize=60)
root.rowconfigure(10, minsize=60)

【问题讨论】:

  • 没有专门内置的,但你只需要一个简单的循环。
  • 刚刚在这篇文章中收到了“热门问题”的通知,我来看看......现在看到这太痛苦了,我已经学会了如何编写 DRY 代码。 :D 这是我的第一篇文章之一,现在我什至不会梦想编写这样的代码,哈哈。

标签: python python-3.x tkinter


【解决方案1】:

当然。

for row_num in range(root.grid_size()[1]):
    root.rowconfigure(row_num, minsize=60)

编辑:您可以将其与循环结合以创建所有这些标签:

#~~~~~~~~~~~< spacer grid >~~~~~~~~~~~
for col_num in range(1, 10):
    spacer=Label(root, text=str(col_num))
    spacer.grid(row = 0, column = col_num)
for row_num in range(10):
    spacer=Label(root, text=str(row_num))
    spacer.grid(row = row_num, column = 0)
    root.rowconfigure(row_num, minsize=60)

【讨论】:

  • 我明白了。那么 [1] 部分是什么?我知道这应该如何工作,但你能帮我理解它的语法吗?我可以看到它调用了一个范围,并为每一行应用 minsize=60 。但我想了解 root.grid_size()[1] 部分。
  • Grid_size() 返回一个包含列数和行数的 2 元组。通过使用 [],您可以选择行或列。更多信息请查看:effbot.org/tkinterbook/grid.htm
  • grid_size() 返回列数、行数的元组。 [1] 仅提取行数。
  • 那么 [0] 会拉出列数吗?
  • 是的。或者,如果您想更清楚:num_cols, num_rows = root.grid_size(),然后在循环中使用num_rows。我也用另一种方式编辑了我的答案。
【解决方案2】:

我创建了一个非常小的(62 行)DSL 来布局类似于 Flutter 的 TKinter 网格。

例子:

from tkinter import W, Tk
from tkinter import ttk
from grid import Grid, Row, RowConfigure, ColumnConfigure, GridOptions, Dummy

window = Tk()
window.title("Grid Layout DSL")
window.geometry('400x400')

def on_click():
    print("Hello from Grid layout")

layout = Grid(
    parent = window,
    row_configure = RowConfigure(pad = 10),
    col_configure = ColumnConfigure(pad = 10),
    grid_options = GridOptions(sticky=W),
    rows = [
        Row(
            children=[
                ttk.Label(window ,text = "First Name:"), 
                ttk.Entry(window)]),
        Row(
            children=[
                ttk.Label(window ,text = "Last Name:"), 
                ttk.Entry(window)]),
        Row(
            children=[
                ttk.Label(window ,text = "Email:"), 
                ttk.Entry(window)]),
        Row(
            children=[
                ttk.Label(window ,text = "Number:"), 
                ttk.Entry(window)]),
        Row(
            children=[
                Dummy(window), 
                ttk.Button(window ,text="Submit", command=on_click)]),
    ]
)

layout.layout()
window.mainloop()

代码只是一个 grid.py(62 行)文件,可在此处免费获得: https://gist.github.com/mnesarco/df03075d8806ed72d784ccabc2d52f12

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 2020-01-16
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2011-01-25
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多