滚动条从 Tkinter 画布中消失,并拒绝坚持侧包装

ano*_*oir 1 python canvas tkinter

  1. 我正在尝试将滚动条附加到 Tkinter 画布。
  2. 为了测试滚动条,我动态生成了 100 个“Hello World”标签,并将它们打包在一个内容保持框架中。

我的代码失败了。问题:

  1. 滚动条甚至不出现。
  2. 相反,内容框架会扩展到 100 个包装标签的全高。
  3. 有趣的是,如果我self.frame_for_content.pack() self.scrollbar.pack(). (我无法理解为什么会这样,但滚动条仍然不起作用或遵守side打包行为。)

我曾尝试将 Brian Oakley 的一些建议纳入scroll regionbbox,但无济于事。

我已将代码减少到最低限度,但无法通过。将不胜感激的帮助。

import tkinter as tk
import tkinter.ttk as ttk

class TestGUI(tk.Tk):
    def __init__(self):
        super().__init__()

        self.canvas = tk.Canvas(self)
        self.frame_for_content = tk.Frame(self.canvas)

        self.canvas_frame = self.canvas.create_window((0,0), window=self.frame_for_content, anchor=tk.NW)

        self.scrollbar = tk.Scrollbar(self.canvas, orient=tk.VERTICAL, command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)

        self.frame_for_content.pack()
        self.canvas.pack(side=tk.LEFT)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        for i in range(100):
            tk.Label(self.frame_for_content, text="Hello World - " + str(i)).pack()

        self.update()
        self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL))

TestGUI().mainloop()
Run Code Online (Sandbox Code Playgroud)

PM *_*ing 5

您不想要,self.frame_for_content.pack()因为您像使用该小部件的几何管理器一样使用画布,因此self.canvas.create_window取代了.packor .grid

要获得正确的尺寸,您可以从画布边界框获取宽度和高度。

我认为这可以满足您的要求:

import tkinter as tk

class TestGUI(tk.Tk):
    def __init__(self):
        super().__init__()

        self.canvas = tk.Canvas(self)
        self.frame_for_content = tk.Frame(self.canvas)
        self.canvas_frame = self.canvas.create_window((0,0), window=self.frame_for_content, anchor=tk.NW)
        self.scrollbar = tk.Scrollbar(self, orient=tk.VERTICAL, command=self.canvas.yview)

        self.canvas.pack(side=tk.LEFT)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        for i in range(100):
            tk.Label(self.frame_for_content, text="Hello World - " + str(i)).pack()

        self.update()
        bbox = self.canvas.bbox(tk.ALL)
        self.canvas.config(yscrollcommand=self.scrollbar.set, 
            width=bbox[2], height=bbox[3], scrollregion=bbox)

TestGUI().mainloop()
Run Code Online (Sandbox Code Playgroud)