簡體   English   中英

如何在Tkinter中制作可重復使用的滾動條?

[英]How to make reusable scrollbars in Tkinter?

我想創建一種簡單的方法來將滾動條添加到我喜歡的任何框架中。 到目前為止,只有一項有效。 這個腳本怎么了? 什么是正確的方法? 對不起,我對其中隱藏的所有概念仍然只有一個模糊的了解。

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

首先,您設法創建滾動條。 如果將鼠標滾動到第一個滾動條上,它將實際上滾動畫布。 拇指不會出現(或不移動),因為從未為此畫布設置滾動區域。

實際上,您對類和對象的使用已損壞。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM