擅长:python、mysql、java
<p>问题的根源在于帧不可滚动。因此,您必须找到一个支持滚动的小部件,并将其作为向一组小部件添加滚动的基础</p>
<p><code>Canvas</code>小部件通常用于此目的。它通常与内部框架结合使用,这使得使用<code>pack</code>或<code>grid</code>来排列小部件变得很容易。但是,因为您要创建一个相同小部件的垂直堆栈,所以直接在画布上绘制复选按钮更容易</p>
<p>第一步是向框架添加画布和滚动条:</p>
<pre><code>class ChecklistBox(tk.Frame):
def __init__(self, parent, choices, **kwargs):
tk.Frame.__init__(self, parent, **kwargs)
canvas = tk.Canvas(self, background=self.cget("background"))
vsb = tk.Scrollbar(self, command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
...
</code></pre>
<p>接下来,我们将调用<code>create_window</code>,而不是在checkbutton上调用<code>pack</code>。我们可以得到上一个项目的y坐标,以确定下一个项目的放置位置。我们将使用帧的<code>pady</code>选项作为间距</p>
<pre><code> pady = int(str(self.cget("pady")))
for choice in choices:
...
bbox = canvas.bbox("all")
y0 = pady if bbox is None else bbox[3]+pady
canvas.create_window(0, y0, window=cb, anchor="nw")
</code></pre>