python tkinter使用canvas.configure事件绑定失效

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import xlrd
from tkinter import *
# 少了这个canvas就滚动不了
def myfunction(event):
    canvas.configure(scrollregion=canvas.bbox("all"),width=100,height=100)

def main():
    # 创建GUI窗口
    root = Tk()
    # 编辑root窗口名称
    root.title('采购算量'+'请输入各采购物品的数量进行自动计算')
    # 使用centerscreen函数,将制定尺寸的窗口置于屏幕中央

    framel = Frame(root, relief=GROOVE, width=50, height=100, bd=1)
    framel.grid(row=0,column=0)

    canvas = Canvas(framel)
    framel0 = Frame(canvas)
    myscrollbar = Scrollbar(framel, orient="vertical", command=canvas.yview)
    canvas.configure(yscrollcommand=myscrollbar.set)

    myscrollbar.grid(row=0,column=2,sticky='ns')
    canvas.grid(row=0,column=0)
    canvas.create_window((0, 0), window=framel0, anchor='nw')
    framel0.bind("<Configure>", myfunction)

    for i in range(50):
        label = Label(framel0,text='name')
        label.grid(ipadx=2,ipady=2,row = i,column = 0)

    for i in range(50):
        inp = Entry(framel0)
        inp.grid(ipadx=2,ipady=2,row=i,column=1)

    root.mainloop()

if __name__ == '__main__':
    main()

另外的网上的可运行的代码

链接

https://blog.csdn.net/C_Creator/article/details/108856973?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tkinter import *

def data():
    for i in range(50):
       Label(frame,text=i).grid(row=i,column=0)
       Label(frame,text="my text"+str(i)).grid(row=i,column=1)
       Label(frame,text="..........").grid(row=i,column=2)
       inp = Entry(frame)
       inp.grid(ipadx=2, ipady=2, row=i, column=3)

# 少了这个就滚动不了
def myfunction(event):
    canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)

root=Tk()
sizex = 800
sizey = 600
posx  = 100
posy  = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)

canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)

myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()

你的代码中,因为canvas是局部变量,因此无法绑定。更改:

def main():
    global canvas
    #...

因为Canvasscrollregion属性定义了画布的可视范围。

Canvasbbox函数可以获取指定画布对象在画布中的覆盖范围(矩形尺寸)。