步骤 1:删除滚动条上方和下方的空间
The expand
选项确定 tkinter 如何处理未分配的空间。额外的空间将平均分配给该值为的所有小部件1
or True
。因为它被设置为1
对于滚动条,它被给予一些额外的空间,导致小部件上方和下方的填充。
相反,您想要的是将所有空间仅分配给画布。通过设置来做到这一点expand
将滚动条归零:
myscrollbar.pack(fill=X, expand=0)
第2步:当画布大小改变时调用函数
下一个问题是,当画布大小改变时,您希望内部框架变大,因此您需要绑定到<Configure>
画布的事件。
def OnCanvasConfigure(self, event):
<code to set the size of the inner frame>
...
self.canvas.bind("<Configure>", self.OnCanvasConfigure)
第三步:让画布控制内框的大小
你不能只改变内框的大小OnCanvasConfigure
,因为框架的默认行为是缩小以适合其内容。在这种情况下,您希望内容扩展以适合框架,而不是缩小框架以适合内容。
有几种方法可以解决这个问题。你可以转几何传播关闭内部框架,这将防止内部小部件更改框架的大小。或者,您可以让画布强制框架的大小。
第二种解决方案是最简单的。我们所要做的就是使用画布的高度作为框架高度,并使用内部文本小部件的宽度之和作为框架宽度。
def OnCanvasConfigure(self, event):
width = 0
for child in self.sensorsStatsFrame.grid_slaves():
width += child.winfo_reqwidth()
self.canvas.itemconfigure(self.canvas_frame, width=width, height=event.height)
第四步:修复滚动条
还有一个问题需要解决。如果您调整窗口大小,您会注意到如果窗口太小,tkinter 会截断滚动条。您可以通过删除调整窗口大小的功能来解决此问题,但您的用户会讨厌这样做。
更好的解决方案是在滚动条被切断之前使文本小部件收缩。您可以通过调用顺序来控制它pack
.
当没有足够的空间容纳所有小部件时,tkinter 将开始减小小部件的大小,从添加到窗口的最后一个小部件开始。在您的代码中,滚动条是最后一个小部件,但如果您将其设为画布,则滚动条将保持不变,而画布将缩小(这反过来会导致框架缩小,从而导致文本小部件缩小)。
myscrollbar.pack(side="bottom", fill=X, expand=0)
self.canvas.pack(fill=BOTH, expand=1)