【问题标题】:Resizing only the canvas width not working with pack()仅调整画布宽度不适用于 pack()
【发布时间】:2017-09-07 08:08:10
【问题描述】:

我的目标是在启动时进行提示,并根据输入的整数,让这些画布适合框架。框架必须具有固定的高度(画布也应该如此),但宽度应根据窗口的大小而变化,并在画布之间平均分布。

这适用于最多 4 个画布,之后画布也不适合最大窗口。

另外,为什么我看不到画布上方和下方的 20 像素空灰色框,因为画布的高度小于框架的高度?

from tkinter import *
from tkinter import simpledialog

b=[]
root = Tk()
no_of_players=simpledialog.askinteger(prompt="Enter here", title="No of participants")

status_frame=Frame(root, bg='gray', height=100)
status_frame.pack(fill=X)
for i in range(no_of_players):
    c=Canvas(status_frame,  bg="orange")
    b.append(c)
    b[i].pack(side=LEFT,fill=X, expand=True)
root.mainloop()

编辑

from tkinter import *
from tkinter import simpledialog

b=[]
root = Tk()
no_of_players=simpledialog.askinteger(prompt="Enter here", title="No of participants")

status_frame=Frame(root, bg='gray', height=500)
status_frame.pack(fill=X)
for i in range(no_of_players):
    c=Canvas(status_frame, width=1, height=100, bg="orange")
    b.append(c)
    b[i].pack(side=LEFT,fill=X, expand=True)
root.mainloop()

【问题讨论】:

  • 我不明白你的问题。您永远不会设置画布宽度,因此它默认为某个值(在我的机器上为 378 像素)。你认为它没有做什么?
  • @Jonathan 在第二个asnwer 中提出了类似的建议。我基本上希望画布的数量完全填满 X 方向上的框架,即基于画布的数量,即使在调整窗口大小时,它们也应该在它们之间划分可用的框架宽度。
  • 我建议你暂时给status_frame一个独特的颜色,这样你就可以看到它的边缘在哪里。我的猜测是,它们不是你想象的那样。

标签: python user-interface tkinter tkinter-canvas


【解决方案1】:

画布有一个默认大小,它们会尝试使用它。由于窗口和框架将尝试扩大或缩小以容纳所有子窗口,因此当默认宽度乘以画布数量超过窗口大小时,主窗口会增长。

解决方案非常简单:给画布一个小的最小宽度,然后给主窗口一个首选大小,然后让画布展开以填充该区域。

例如:

...
root.geometry("400x100")
...
for i in range(no_of_players):
    c=Canvas(..., width=1)
    ...
...

至于为什么看不到上面和下面的空格,是因为pack的默认是side='top',所以它会尽量贴在它已经放入的空格的顶部。

如果你想要上下空间,使用pady,例如:

status_frame.pack(fill=x, pady=20)

【讨论】:

  • 完美解决了第一个问题。第二个:但我确实指定了side=LEFT。而且,就算是top,如果canvas的高度低于它设置的frame的高度,不应该默认有空格吗?
  • @SatwikPasani:是的,您为画布指定了side=LEFT。我不确定你在说什么。 side=LEFT 绝对是您在这种特定情况下应该做的。如果画布的高度低于窗口,则下方会有空白区域,但上方不会。同样,您指定了“TOP”,所以它被放在顶部。
  • 如果我不清楚,我很抱歉。当框架的高度设置为 500,画布的高度为 150 时,在打包画布时 side=LEFT,应该会留下一些空框架。我无法看到它。我应该发布其他内容来澄清问题吗?问题中的编辑。
  • @SatwikPasani:请注意,当您在框架上设置高度,然后将小部件放入该框架中时,框架将缩小或扩大以适应窗口。 99.99% 的时间这就是你想要的。目前尚不清楚您是否希望框架高度为 500 像素,或者您是否希望窗口高度为 500 像素,或者两者都为 500 像素高。
  • 我希望框架保持 500 像素高。我需要指定任何额外的东西来实现吗? (出于学术兴趣。对于该项目,拟合很好)
猜你喜欢
  • 2017-01-12
  • 2017-12-15
  • 2021-12-05
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2019-05-23
  • 2012-05-22
相关资源
最近更新 更多