【问题标题】:Tkinter Grid "Sticky" Doesn't Work With Grid PropagateTkinter 网格“粘性”不适用于网格传播
【发布时间】:2021-09-21 03:16:15
【问题描述】:

我遇到的问题的简化版本。以下代码产生此输出:

from tkinter import *

# init root
root = Tk()

# get window size
windowWidth = root.winfo_screenwidth()
windowHeight = root.winfo_screenheight()

# create green frame
greenFrame = Frame(root,width=windowWidth, height=windowHeight/2, borderwidth = 0, highlightthickness = 0, bg='green')
greenFrame.grid_propagate(0) # fixed size
greenFrame.grid(row=0, column = 0)

# create blue canvas inside green frame
blueCanvas = Canvas(greenFrame, width=windowWidth/5, height=windowHeight/2, borderwidth = 0, highlightthickness = 0, bg='blue')
blueCanvas.grid(row=0, column = 0, sticky = 'e') # display it on the right side

# run loop
root.mainloop()

蓝色画布设置在绿色框架中。我的问题是,为什么在网格调用中设置了sticky = 'e'时,蓝色画布不会出现在绿色框架的右侧?

提前致谢!

【问题讨论】:

  • 你认为 Sticky 有什么作用?
  • 我的印象是,当它的父小部件尺寸较大时,它会将小部件位置移动到指定的一侧
  • 检查this
  • 我给框架的尺寸为 100x100,画布的尺寸为 50x50,蓝色方块(画布)仍然位于绿色框架的左上角

标签: python tkinter


【解决方案1】:

我的问题是,为什么在网格调用中设置了sticky = 'e'时,蓝色画布没有出现在绿色框的右侧?

您将蓝色画布放置在第 0 列中,该列将从绿色框的最左侧开始。你给它的宽度是窗口宽度的 1/5,所以这是grid 为其分配的空间。其他 4/5 的窗口未被网格使用。

【讨论】:

  • 好的,所以网格传播保持了框架的原始尺寸,但不使它可以被子小部件的网格调用使用?有没有办法做到这一点?
  • @JasonEllis:我不知道您所说的“无法使用”是什么意思。 grid_propagate 与是否使空间可用无关。如果你想要右边的框架,最简单的方法是使用pack。或者,继续使用grid 并配置第 0 列以占用所有空间或将其添加到其他一些列并配置其他列以占用剩余空间。
  • 啊,好吧,我可以通过将greenFrame.grid_propagate(0) 切换到greenFrame.pack_propagate(0) 并打包蓝色画布而不是使用grid 来获得我想要的东西。我现在意识到传播方法是指子小部件,而不是父小部件。感谢您的帮助。
  • @Brian Oakley 出于好奇,我将如何配置一个列以使用网格占用所有剩余空间?我在文档中没有看到这个选项
  • @JasonEllis:您可以使用grid_columnconfigure 为一列或多列提供weight。然后,网格将相对于它们的权重将任何额外的空间分配给其他列。
猜你喜欢
  • 1970-01-01
  • 2020-10-18
  • 2017-09-10
  • 2018-03-29
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多