2013-09-30 2 views
6

다음 코드를 참조하십시오를 만들려면 다음서브 클래스 Tkinter를 사용자 정의 위젯

class ScrollableTextWidget(Tkinter.Text): 
    def __init__(self, parent): 
     self.parent = parent 
     self.Frame = ttk.Frame(self.parent) 
     Tkinter.Text.__init__(self, self.Frame, width=1, height=1) 
     self.__initWidget() 

    def __initWidget(self): 
     self.Frame.grid(sticky="NSEW") 
     self.ScrollbarY = ttk.Scrollbar(self.Frame, orient="vertical", command=self.yview) 
     self.configure(yscrollcommand=self.ScrollbarY.set) 
     self.grid(column=0, row=0, sticky="NSEW") 
     self.ScrollbarY.grid(column=1, row=0, sticky="NS") 
     self.Frame.columnconfigure(0, weight=1) 
     self.Frame.rowconfigure(0, weight=1) 
(나는 기본적으로 내 클래스의 모든 메소드/Tkinter.Text에서 기능을 유지하면서 수직 스크롤과 텍스트 위젯을 만들려고하고있다)

위와 같이 사용자 정의 위젯을 작성하는 것이 좋습니까? 아니면 프레임에 넣고 직접 작성해야합니까?

답변

2

서브 클래 싱은 쉽게 교체하거나 업데이트 할 수 있기 때문에 중간, 큰 프로젝트 또는 향후 지원을받는 프로젝트에 서브 클래스를 사용합니다. 어떤 경우 든 상속 비용은 적습니다. 하지만 작업이 일회용이라면 더럽고 빠릅니다.

이 경우 가장 일반적인 위젯이므로 pack, grid 및 기타 방법을 재정의 할 필요가 없으므로이 프레임에서 서브 클래 싱을 수행합니다.

+0

나는 사용자 정의 위젯을 만들기 위해 Tkinter.Text (또는 다른 위젯이 메소드와 함수를 유지하도록) 하위 클래스를 만드는 것이 좋습니다. 이 경우 Tkinter.Text를 하위 클래스 화하여 클래스의 프레임에 스크롤바를 배치합니다. 아니면 프레임 하위 클래스 및 텍스트 위젯 및 스크롤 막대를 직접 배치하고 내 자신의 메서드 및 함수를 만들어야합니까? – user2830098

+0

내 대답의 업데이트보기 –

16

위젯을 서브 클래 싱하여 맞춤형을 만드는 것은 매우 정상입니다. 그러나이 사용자 정의 위젯이 두 개 이상의 위젯으로 구성되는 경우 일반적으로 Frame의 하위 클래스가됩니다. 텍스트를 삽입 할 때 내부 텍스트 위젯을 참조 할 필요가 얼마나 주목,이 방법

import Tkinter as tk 

class ScrolledText(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 
     self.text = tk.Text(self, *args, **kwargs) 
     self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview) 
     self.text.configure(yscrollcommand=self.vsb.set) 
     self.vsb.pack(side="right", fill="y") 
     self.text.pack(side="left", fill="both", expand=True) 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.scrolled_text = ScrolledText(self) 
     self.scrolled_text.pack(side="top", fill="both", expand=True) 
     with open(__file__, "r") as f: 
      self.scrolled_text.text.insert("1.0", f.read()) 

root = tk.Tk() 
Example(root).pack(side="top", fill="both", expand=True) 
root.mainloop() 

예를 들어, 내가 같은 것을 할 것입니다 스크롤이있는 텍스트 위젯입니다 위젯을 만들 수 있습니다. 이 위젯을 실제 텍스트 위젯과 유사하게 보이게하려면 일부 또는 모든 텍스트 위젯 기능에 대한 맵핑을 작성할 수 있습니다. 예를 들어 :

import Tkinter as tk 

class ScrolledText(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent) 
     self.text = tk.Text(self, *args, **kwargs) 
     self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview) 
     self.text.configure(yscrollcommand=self.vsb.set) 
     self.vsb.pack(side="right", fill="y") 
     self.text.pack(side="left", fill="both", expand=True) 

     # expose some text methods as methods on this object 
     self.insert = self.text.insert 
     self.delete = self.text.delete 
     self.mark_set = self.text.mark_set 
     self.get = self.text.get 
     self.index = self.text.index 
     self.search = self.text.search 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.scrolled_text = ScrolledText(self) 
     self.scrolled_text.pack(side="top", fill="both", expand=True) 
     with open(__file__, "r") as f: 
      self.scrolled_text.insert("1.0", f.read()) 

root = tk.Tk() 
Example(root).pack(side="top", fill="both", expand=True) 
root.mainloop() 
+0

정말 고맙습니다. 투표를하려고했으나 답변을 수락했지만 불행히도 저의 평판은 너무 낮습니다. 또 다른 방법은 ttk 트리 뷰를 같은 방식으로 만들고 이벤트를 바인드 할 수있는 방법은 무엇입니까? 프레임에서 트리 뷰 인스턴스를 노출하고 사용해야합니까? – user2830098

+1

당신의 솔루션에 대한 문제는 정확하게 텍스트 멤버 메소드를 수동으로 노출해야한다는 것입니다. OP는이를 무료로 얻으려고합니다. 그러므로 나는 텍스트를 서브 클래 싱하는 그의 원래 아이디어가 올바른 방법이라고 생각한다. 내 Tkinter 마스터 링은 너무 가볍기 때문에 문제에 답할 수 없지만 누군가가 그렇게 할 수 있다면 기쁜 일입니다. – quickbug