水平和垂直滚动 Canvas 小部件

原理与 Text 小部件基本相同,但是 Grid 布局用于将滚动条放在小部件周围。

canvas = tk.Canvas(parent, width=150, height=150)
canvas.create_oval(10, 10, 20, 20, fill="red")
canvas.create_oval(200, 200, 220, 220, fill="blue")
canvas.grid(row=0, column=0)

scroll_x = tk.Scrollbar(parent, orient="horizontal", command=canvas.xview)
scroll_x.grid(row=1, column=0, sticky="ew")

scroll_y = tk.Scrollbar(parent, orient="vertical", command=canvas.yview)
scroll_y.grid(row=0, column=1, sticky="ns")

canvas.configure(yscrollcommand=scroll_y.set, xscrollcommand=scroll_x.set)

与 Text 小部件不同,Canvas 的可滚动区域在其内容被修改时不会自动更新,因此我们需要定义它并使用 scrollregion 参数手动更新它:

canvas.configure(scrollregion=canvas.bbox("all"))

canvas.bbox("all") 返回适合整个画布内容的矩形坐标。