<h2>第一步:删除滚动条上下的空格</h2>
<p><code>expand</code>选项决定了tkinter如何处理未分配的空间。额外的空间将平均分配给值为<code>1</code>或<code>True</code>的所有小部件。因为滚动条的值设置为<code>1</code>,所以会给它一些额外的空间,导致小部件的上下填充。在</p>
<p>相反,您需要的是将所有空间仅分配给画布。通过在滚动条上将<code>expand</code>设置为零来执行此操作:</p>
<pre><code>myscrollbar.pack(fill=X, expand=0)
</code></pre>
<h2>步骤2:当画布改变大小时调用函数</h2>
<p>下一个问题是,当画布改变大小时,您希望内部框架增长,因此需要绑定到画布的<code><Configure></code>事件。在</p>
^{pr2}$
<h2>步骤3:让画布控制内部框架的大小</h2>
<p>不能只更改<code>OnCanvasConfigure</code>中内部框架的大小,因为框架的默认行为是收缩以适应其内容。在这种情况下,您希望内容展开以适合框架,而不是框架收缩以适合内容。在</p>
<p>有几种方法可以解决这个问题。您可以为内部帧禁用<em>几何传播</em>,这将阻止内部小部件更改帧的大小。或者,可以让画布强制调整帧的大小。在</p>
<p>第二种方法最简单。我们所要做的就是使用画布的高度作为框架高度,并使用内部文本小部件的宽度之和作为框架宽度。在</p>
<pre><code>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)
</code></pre>
<h2>第四步:修复滚动条</h2>
<p>还有一个问题要解决。如果你调整窗口的大小,你会发现如果窗口太小,tkinter会切掉滚动条。您可以通过删除调整窗口大小的功能来解决这个问题,但您的用户会讨厌这样做。在</p>
<p>更好的解决方案是在滚动条被切掉之前让文本小部件收缩。您可以通过调用<code>pack</code>的顺序来控制它。在</p>
<p>当没有足够的空间来容纳所有的窗口小部件时,tkinter将开始缩小窗口小部件的大小,从最后一个添加到窗口的小部件开始。在您的代码中,滚动条是最后一个小部件,但是如果您将其改为画布,滚动条将保持不变,画布将收缩(这反过来导致框架收缩,从而导致文本小部件收缩)。在</p>
<pre><code>myscrollbar.pack(side="bottom", fill=X, expand=0)
self.canvas.pack(fill=BOTH, expand=1)
</code></pre>