如何在Tkinter中制作可重复使用的滚动条?

时间:2014-12-23 07:35:06

标签: python class tkinter scrollbar

我想创建一种将滚动条添加到我喜欢的任何帧的简单方法。到目前为止,只有一个有效。这个脚本有什么问题?这样做的正确方法是什么?我仍然只是对隐藏在其中的所有概念有一点隐约,抱歉。

import Tkinter as tk

def data(parent):
    for i in range(50):
       tk.Label(parent,text=i).grid(row=i,column=0)
       tk.Label(parent,text="my text"+str(i)).grid(row=i,column=1)
       tk.Label(parent,text="..........").grid(row=i,column=2)

class ScrollBar():
    #def __init__(self, tk):
    #    self.canvas = tk.Canvas()

    def myfunction(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"), width=200, height=200)
        print("orig: ",self.canvas)

    def makeScrollBar(self, tk, parent):

        self.outerframe = tk.Frame(parent, relief="groove", width=50, height=100, bd=1)
        self.outerframe.pack()

        self.canvas = tk.Canvas(self.outerframe)
        self.innerframe = tk.Frame(self.canvas)
        self.myscrollbar = tk.Scrollbar(self.outerframe, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.myscrollbar.set)

        self.myscrollbar.pack(side="right",fill="y")

        self.canvas.pack(side="left")
        self.canvas.create_window((0,0), window=self.innerframe, anchor="nw")

        self.innerframe.bind("<Configure>", self.myfunction)
        print("orig: ",self.canvas)
        return self.innerframe

root = tk.Tk()
root.wm_geometry("800x600+100+100")

scrollbargenerator = ScrollBar()
b = scrollbargenerator.makeScrollBar(tk, root)
c = scrollbargenerator.makeScrollBar(tk, root)
data(b)
data(c)
root.mainloop()

1 个答案:

答案 0 :(得分:1)

首先,您设法创建滚动条。如果将鼠标滚动到第一个滚动条上,它实际上会滚动画布。拇指没有出现(或不移动),因为从未为此画布设置过滚动区域。

事实上,您对类和对象的使用已被破坏。您的Scrollbar类被实例化一次,并且每次调用makeScrollBar时,此实例仅更新其字段。因此,在myfunction回调中,self.canvas始终引用最后创建的画布。

您可以使用不同的滚动条生成器轻松修复代码

scrollbargenerator = ScrollBar()
b = scrollbargenerator.makeScrollBar(tk, root)
scrollbargenerator = ScrollBar()
c = scrollbargenerator.makeScrollBar(tk, root)

或在闭包中捕捉画布

def myfunction(self, canvas):
    canvas.configure(scrollregion=canvas.bbox("all"), width=200, height=200)

def makeScrollBar(self, tk, parent):
    #(...)
    self.innerframe.bind("<Configure>", (lambda canvas: (lambda event: self.myfunction(canvas)))(self.canvas))

或依赖事件中已存在的信息

@staticmethod
def myfunction(event):
    event.widget.master.configure(scrollregion=event.widget.master.bbox("all"), width=200, height=200)