【问题标题】:Prevent Tkinter grid from dynamically resizing cells防止 Tkinter 网格动态调整单元格大小
【发布时间】:2019-09-21 18:11:23
【问题描述】:

我有一个 Tkinter 类,其中有一个网格,每个网格行的权重应与行配置中所述的权重相同,并且当我关闭传播时,网格的内容不应影响网格尺寸。

只要我在网格中有带有背景颜色的空框架,这就会正常工作,但是一旦我将一个按钮添加到顶部网格行,与其他行相比,该行的大小会增加大约按钮的高度本身。代码如下:

class MainMenuPage(tkinter.Frame):
def __init__(self,parent,controller):
    tkinter.Frame.__init__(self,parent)
    self.controller=controller

    self.columnconfigure(0,weight=1)
    self.rowconfigure(0,weight=1)
    self.rowconfigure(1,weight=1)
    self.rowconfigure(2,weight=1)
    self.rowconfigure(3,weight=1)
    self.grid_propagate(0);

    self.color0=tkinter.Frame(self,bg="#bd1e2b")
    self.color0.grid(column=0,row=0,sticky="nesw")

    self.color1=tkinter.Frame(self,bg="#1e1ebd")
    self.color1.grid(column=0,row=1,sticky="nesw")

    self.color2=tkinter.Frame(self,bg="#1ebd48")
    self.color2.grid(column=0,row=2,sticky="nesw")

    self.color3=tkinter.Frame(self,bg="#bdb81e")
    self.color3.grid(column=0,row=3,sticky="nesw")

    image=Image.open("/path/settingsIcon.png")
    image=image.resize((54,54),Image.ANTIALIAS)
    self.settingsIcon=ImageTk.PhotoImage(image)
    self.settingsButton=tkinter.Button(self,compound=tkinter.TOP,width=54,height=54,image=self.settingsIcon,command=lambda:self.controller.showPage("valveMain"))
    self.settingsButton.grid(column=0,row=0,sticky="ne")

添加按钮时如何防止网格改变大小?

【问题讨论】:

  • 您是否想要实施严格的限制,或者您是否愿意提供一种解决方案,在某一行改变高度时调整所有行的高度?换句话说,目标是“不要让行调整大小”还是“所有行都应该是相同的大小”?我不明白您为什么要强制行高小于该行的高度。
  • 就是这样,按钮不比行大。但我基本上确实想强制执行严格的尺寸,但我不想以绝对尺寸而是以比率(重量)强制它们
  • 我想让网格相对于它们的父级而不是它的内容调整大小
  • weight 不用于定义相对大小。它用于定义如何分配额外的空间。
  • 那么我如何获得一个表格,其中每一行都分配了相同的高度,并且不受内容的影响

标签: python tkinter raspberry-pi grid tkinter-layout


【解决方案1】:

我并不完全理解你想要完成什么。如果目标是确保每行和/或列的大小相同,则可以将行和列配置为统一组的一部分。 weight 单独不会这样做,因为它只配置额外空间的分配方式,不控制行或列的绝对大小。

要创建统一组,请为row_configure 和column_configure 使用uniform 选项。同一统一组中的所有行或列将具有与其权重成比例的相同大小。如果它们的重量相同,它们的大小将相同。

来自规范的 tcl/tk 文档:

-uniform 选项在提供非空值时,将该行与具有相同 -uniform 值的其他行放在一个统一组中。为属于统一组的行分配空间,以便它们的大小始终与其 -weight 值严格成比例。

在你的情况下,你可以尝试这样的事情:

self.rowconfigure(0,weight=1, uniform='row')
self.rowconfigure(1,weight=1, uniform='row')
self.rowconfigure(2,weight=1, uniform='row')
self.rowconfigure(3,weight=1, uniform='row')

有关更多信息,请参阅 tcl/tk 文档中的The grid algorithm。它准确地描述了网格算法的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多