如何使 window 中的滚动条起作用?

How to make the scrollbar in the window to work?

滚动条在那里,鼠标滚轮也被绑定,但滚动条本身没有按应有的方式运行。滚动条只是停留在它的位置并且不会实时起作用。应该怎么办?

import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk



def on_window1():

    top = tk.Toplevel()
    top.wm_geometry("794x470")
    top.title('Optimized Map 1')


    frame = tk.Frame(top)
    frame.grid(row=3, column=0)

    canvas1 = tk.Canvas(top, width=400, height=280)
    canvas1.grid(row=0,column=200)

    for i in range(40):
        l3 = tk.Label(canvas1, text="Number of Rectangles:" + str(i))
        canvas1.create_window(50,21*i, window=l3, anchor=tk.NW)

    myscrollbar= tk.Scrollbar(top,orient=tk.VERTICAL,command=canvas1.yview)
    myscrollbar.grid(row=0,column=200, sticky=tk.NS)
    #canvas1.configure(yscrollcommand=myscrollbar.set)
    canvas1.bind_all('<MouseWheel>', lambda event: canvas1.yview_scroll(int(-1*(event.delta/120)), "units"))



    #l4 = tk.Label(canvas1, text="Number of Rectangles:")
    #canvas1.create_window(50,21, window=l4, anchor=tk.NW)

window = tk.Tk()


b1 = tk.Button(window, text="Next", command=on_window1)
b1.grid(row=0, column=0)

window.mainloop()

您必须配置 canvas 的 scrollregion 属性,它告诉 tkinter 正在使用多少虚拟 canvas。大多数情况下,这被设置为 边界框 ,如 return 由 bbox 命令编辑。

bbox 命令 returns 包含一组元素的框的坐标。如果您将字符串 "all" 传递给它,它将 return 包含 canvas.

中所有对象的框的坐标

将所有内容添加到 canvas 后,添加这行代码:

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