2014-12-23 2 views
0

나는 좋아하는 프레임에 스크롤바를 추가하는 쉬운 방법을 만들고 싶습니다. 지금까지 단 하나만 작동합니다. 이 스크립트의 문제점은 무엇입니까? 이 작업을 수행하는 적절한 방법은 무엇입니까? 나는 아직도 숨겨진 모든 개념을 희미하게 파악하고 있습니다. 미안합니다.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() 

답변

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) 
관련 문제