阻止Tkinter框架根据小部件大小重新调整大小

10
root = Tk()

descriptionFrame = Frame(root)

definitionFrame = LabelFrame(descriptionFrame, text="Definition")
definitionScroll = Scrollbar(definitionFrame)
definitionCanvas = Canvas(definitionFrame, width=30, height=4, yscrollcommand=definitionScroll.set)
definitionScroll.config(command=definitionCanvas.yview)
definitionLabel = Label(definitionCanvas, text="n/a")

descriptionFrame.pack()
definitionFrame.pack()
definitionScroll.pack(side=RIGHT, fill=Y)
definitionCanvas.pack(side=LEFT, fill=BOTH, expand=True)
definitionLabel.pack(fill=BOTH, expand=True)

root.mainloop()

我有这段代码。Canvas的宽度设置为30,高度设置为4,但是当我运行这个程序时,它会忽略Canvas的大小,并且生成的窗口大小以Label为准。我尝试在代码中的每个Frame上使用pack_propagate(False),但它对definitionFrame没有任何影响,而当我在descriptionFrame上使用它时,结果是一个空白窗口。如何创建一个GUI,使得所有的帧和窗口大小都根据Canvas的宽度30和高度4进行调整?

谢谢。


你的目标是什么样的结果?在Canvas的父级中添加标签似乎非常不寻常 - Canvas用于绘制图表等,通常在其上绘制事物的方法是Canvas.create_(text | rectangle | widget | etc)。 - Shish
@Shish 我希望在definitionFrame内部有一个标签。理想情况下,我希望definitionFrame的宽度为30,高度为4,并且标签根据定义字符串的长度而改变大小。但是在这种情况下,每当字符串过长无法适应宽度为30和高度为4的标签时,我需要滚动条,因此我添加了画布,因为滚动条无法附加到标签或标签框架上。不确定这样做是否正确。 - Jigglypuff
3个回答

19

要回答你的具体问题,即如何阻止帧(或任何容器小部件)自适应其内容大小而调整大小,你需要根据使用的几何管理器调用pack_propagate(False)grid_propagate(False)。如果你尝试过这样做,但没有成功,那么你可能是做错了。由于你没有发布代码,我们无法确定出错的原因。

当你调用pack_propagate(False)时,你必须确保该小部件具有合适的大小。标签和按钮会有一个默认的大小以适应其文本,但是帧将具有一个默认的1x1大小,使内容几乎不可见。如果在帧上使用此方法,请确保为其指定明确的宽度和高度。


2

默认情况下,只有Listbox、Text、Canvas和Entry是可滚动的;Canvas也可以工作,但在我看来有点过度设计,所以这里提供了一些使用Text实现你想要的东西的内容。

#!/usr/bin/python
from Tkinter import *
root = Tk()

descriptionFrame = Frame(root)

definitionFrame = LabelFrame(descriptionFrame, text="Definition")
definitionScroll = Scrollbar(definitionFrame)
definitionText = Text(definitionFrame, width=30, height=4, yscrollcommand=definitionScroll.set)
definitionScroll.config(command=definitionText.yview)

definitionText.delete("1.0", END)   # an example of how to delete all current text
definitionText.insert("1.0", "n/a") # an example of how to add new text to the text area

descriptionFrame.pack(fill=BOTH, expand=True)
definitionFrame.pack(fill=BOTH, expand=True)
definitionScroll.pack(side=RIGHT, fill=Y)
definitionText.pack(side=LEFT, fill=BOTH, expand=True)

root.mainloop()

0
我所做的是设置根窗口不可调整大小:root.resizable(False, False),然后定义画布的宽度和高度:Canvas(root, height=500, width=1500)并最终以相对宽度和高度为1放置我的帧:frame.place(relheight=1, relwidth=1)。随后我将所有小部件放在特定的y/x值上,并使用pack()打包,但如果你想将所有东西的大小设置为画布,你也可以采用同样的方法;我认为这是一个更简单的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接