Python 特金特帆布公司;带网格的滚动条

Python 特金特帆布公司;带网格的滚动条,python,tkinter,grid,scrollbar,tkinter-canvas,Python,Tkinter,Grid,Scrollbar,Tkinter Canvas,我有一个画框里的画布 photoFrame = Frame(centerFrame, width=250, height=190, bg="#EBEBEB") photoFrame.grid(row=0, column=1, sticky="nsew") photoCanvas = Canvas(photoFrame, bg="#EBEBEB") photoCanvas.grid(row=0, column=0, sticky="nsew") 我试着用这个在画布上放一个滚动条 photoScr

我有一个画框里的画布

photoFrame = Frame(centerFrame, width=250, height=190, bg="#EBEBEB")
photoFrame.grid(row=0, column=1, sticky="nsew")
photoCanvas = Canvas(photoFrame, bg="#EBEBEB")
photoCanvas.grid(row=0, column=0, sticky="nsew")
我试着用这个在画布上放一个滚动条

photoScroll = Scrollbar(photoFrame, orient=VERTICAL)
photoScroll.config(command=photoCanvas.yview)
photoCanvas.config(yscrollcommand=photoScroll.set)
photoScroll.grid(row=0, column=1, sticky="ns")
滚动条出现,但已禁用。你能帮我吗

对不起,我的英语不好

在for循环中,我用这段代码添加了很多图像按钮

element = Button(photoCanvas, image = listPhotos[i], borderwidth=0, height = 200, width = 200, bg="#EBEBEB")
element.grid(row=rowPhoto, column=columnPhoto, padx=5, pady=5, sticky="nsew")
最后我有这个

    root = Tk()    
    photoFrame = Frame(root, width=250, height=190, bg="#EBEBEB")


    photoCanvas = Canvas(photoFrame, bg="#EBEBEB")
    photoCanvas.grid(row=0, column=0, sticky="nsew")

    for i in range(0, len(listPhotos), 1):
       element = Button(photoCanvas, image = listPhotos[i], borderwidth=0, height = 200, width = 200, bg="#EBEBEB")
       element.grid(row=rowPhoto, column=columnPhoto, padx=5, pady=5, sticky="nsew")

    photoScroll=Scrollbar(photoFrame,orient=VERTICAL)
    photoScroll.config(command=photoCanvas.yview)
    photoCanvas.config(yscrollcommand=photoScroll.set)
    photoScroll.grid(row=0, column=1, sticky="ns")
在我的应用程序中,紫色矩形是下一帧,我需要一个垂直滚动条


假设您有一些问题

滚动一组小部件的一种方法是将它们(使用
pack
grid
)放在一个框架内,并将此框架放在画布内

滚动工作的两个关键要素(除了将滚动条连接到画布外)是:

  • 使用
    canvas.create_window(x,y,window=frame)
    将框架放在画布中,以便将其视为画布项目
  • 每次帧大小更改时(例如在添加新小部件后),使用
    canvas.configure(scrollregion=canvas.bbox('all'))
    更新画布滚动区域
下面是问题代码的改编,但使用OP问题和
网格中的小部件名称,而不是
pack

import tkinter as tk

def update_scrollregion(event):
    photoCanvas.configure(scrollregion=photoCanvas.bbox("all"))

root = tk.Tk()   


photoFrame = tk.Frame(root, width=250, height=190, bg="#EBEBEB")
photoFrame.grid()
photoFrame.rowconfigure(0, weight=1) 
photoFrame.columnconfigure(0, weight=1) 

photoCanvas = tk.Canvas(photoFrame, bg="#EBEBEB")
photoCanvas.grid(row=0, column=0, sticky="nsew")

canvasFrame = tk.Frame(photoCanvas, bg="#EBEBEB")
photoCanvas.create_window(0, 0, window=canvasFrame, anchor='nw')

for i in range(10):
   element = tk.Button(canvasFrame, text='Button %i' % i, borderwidth=0, bg="#EBEBEB")
   element.grid(padx=5, pady=5, sticky="nsew")

photoScroll = tk.Scrollbar(photoFrame, orient=tk.VERTICAL)
photoScroll.config(command=photoCanvas.yview)
photoCanvas.config(yscrollcommand=photoScroll.set)
photoScroll.grid(row=0, column=1, sticky="ns")

canvasFrame.bind("<Configure>", update_scrollregion)

root.mainloop()
将tkinter作为tk导入
def update_滚动区域(事件):
photoCanvas.configure(scrollregion=photoCanvas.bbox(“全部”))
root=tk.tk()
相框=传统相框(根,宽=250,高=190,bg=“#ebebebeb”)
photoFrame.grid()
photoFrame.rowconfigure(0,权重=1)
photoFrame.columnconfigure(0,权重=1)
photoCanvas=tk.Canvas(相框,bg=“#ebebebebe”)
photoCanvas.grid(行=0,列=0,sticky=“nsew”)
canvasFrame=tk.Frame(photoCanvas,bg=“#ebebebebe”)
photoCanvas.create_window(0,0,window=canvasFrame,anchor='nw')
对于范围(10)内的i:
element=tk.Button(canvasFrame,text='Button%i'%i,borderwidth=0,bg=“#ebebebebeb”)
网格元素(padx=5,pady=5,sticky=“nsew”)
photoScroll=tk.滚动条(相框,方向=tk.垂直)
photocroll.config(命令=photoCanvas.yview)
photoCanvas.config(yscrollcommand=photocroll.set)
photoScroll.grid(行=0,列=1,sticky=“ns”)
canvasFrame.bind(“,更新\u滚动区域)
root.mainloop()

我用你的评论编辑我的文章,我理解,但这是一个项目,所以我有300多行,有时是私人内容。。。我试着做得更好。这不是一个处理应用程序,其他人可以接受我的设计,如果你打开一个python文件,你可以运行它。我想我建议你把所有的按钮放在一个框架中,然后用
canvas.create_window(x,y,window=frame)
将这个框架放在画布中。请参阅以了解更多详细信息。好的,谢谢。有了这个,滚动条就可以工作了?@j_4321,很少有人能像这样清楚地解释。在开始编码之前,我喜欢你的解释。谢谢你,伙计。