python - Tkinter Canvas 和带网格的滚动条

标签 python tkinter grid scrollbar tkinter-canvas

我有一个框架中的 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")

我试着用这个在我的 Canvas 上放一个滚动条

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")

在我的应用程序中,紫色矩形是下一帧,我需要一个垂直滚动条 enter image description here

有问题就说

最佳答案

滚动一组小部件的一种方法是将它们(带有 gridpack )放在一个框架内,然后将这个框架放在 Canvas 内。

滚动起作用的两个关键元素(除了将滚动条连接到 Canvas 之外)是:

  • 使用canvas.create_window(x, y, window=frame)将框架放在 Canvas 内,以便将其视为 Canvas 项目。
  • 每次框架大小发生变化时(例如添加新的小部件后)更新 Canvas 滚动区域 canvas.configure(scrollregion=canvas.bbox('all')) .

这里是问题代码的改编版 Python Tkinter scrollbar for frame ,但使用 OP 问题中的小部件名称和 grid而不是 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()

关于python - Tkinter Canvas 和带网格的滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47152542/

相关文章:

python - 在 Pandas 数据框中拆分行

python - 解构时更改数据类型

python - numpy.histogram() 是如何工作的?

python - 如何使 tkinter 按钮小部件占用整个网格宽度

jquery - bootstrap可变网格设计布局结构

Python - 使用网格布局来格式化窗口

python - 如何获取书签的页码

Python - 带有 DLL 资源图标的 tkinter.messagebox

python-3.x - 有没有办法克隆 tkinter 小部件?

c# - 根据属性显示/隐藏网格行?