2014-05-20 2 views
0

나는 스크롤을 포함하여 내 일반적인 양식 기능을 정의하는 기본 클래스를 가지고 있습니다.양식 크기 재조정 살인 형식 스크롤

자손 중 하나에 크기 재 지정 기능을 추가하고 스크롤을 중지했습니다.

다음 추출에서 양식이 스크롤됩니다. 한 줄의 주석을 해제하면 폼과 필드의 크기를 원하는대로 조정할 수 있지만 스크롤은 작동하지 않습니다.

누군가 도와 줄 수 있습니까?

from Tkinter import * 
import ttk 

class DisplayListWindow(Canvas): 

    def __init__(self, parent=None, *args, **kw): 
     Canvas.__init__(self,parent, borderwidth=0, *args, **kw) 

     self.frame = Frame(self) 
     vsb = Scrollbar(parent, orient="vertical", command=self.yview) 
     self.configure(yscrollcommand=vsb.set) 
     vsb.pack(side="right", fill="y") 

     self.create_window((4,4), window=self.frame, anchor="nw", 
           tags="self.frame") 

     self.pack(side="left", fill="both", expand=True) 

     self.frame.bind("<Configure>", self.OnFrameConfigure) 

     #remaining code in this function is from descendant classes 
     for i in range(1, 20, 1): 
      ttk.Entry(master=self.frame, style='C.TEntry').grid(row = i, column = 0, sticky = NSEW) 
      ttk.Entry(master=self.frame, style='C.TEntry').grid(row = i, column = 1, sticky = NSEW) 
      self.frame.columnconfigure(1, weight=1) 

     #the following line enables the re-sizing behaviour, but kills scrolling 
     #self.frame.pack(side="left", fill="both", expand=True) # <== problem  

    #----------------------------------------------------------------------   
    def OnFrameConfigure(self, event): 
     '''Reset the scroll region to encompass the inner frame''' 
     self.configure(scrollregion=self.bbox("all")) 

DisplayListWindow().mainloop() 

답변

0

당신이 스크롤의 목적을 위해 캔버스 내부 프레임을 사용하는 경우 create_window를 사용하여 캔버스에 추가해야합니다 - 당신이 pack 또는 grid를 사용하여 추가 할 수 있습니다. 이 두 가지 메소드 (create_window, pack 또는 grid)는 서로 호환되지 않습니다.

창 크기를 조정할 때 프레임의 크기를 조정하려면 수동으로 크기를 조정하는 코드를 추가해야합니다. <Configure> 콜백의 너비를 조정하면됩니다. 예를 들어

:

def OnFrameConfigure(self, event): 
    '''Reset the scroll region to encompass the inner frame''' 
    width = self.winfo_width() - 8 # allow room for some padding 
    self.itemconfigure("self.frame", width=width) 
    self.configure(scrollregion=self.bbox("all")) 

공지 사항 나는 폭이 캔버스의 폭을 얻어서해야 무엇을 계산 한 다음 I 프레임의 폭을 설정하는 값을 사용하는 방법. 높이는 프레임의 자연스러운 높이로 남겨 지므로 세로 스크롤 막대는 항상 프레임의 전체 내용을 반영해야합니다.

+0

답변 해 주셔서 감사합니다. 제안한대로 Configure 이벤트를 조정하면 내가 원하는 것이었던 컬럼 가중치를 존중한다는 것을 알 수 있습니다. 이것은 처음에 양식이 표시 될 때 발생하지만, 수동으로 양식의 크기를 조정하면 팩을 사용할 때처럼 프레임이 늘어나지 않습니다. 내가 묶어야 할 다른 사건이 있습니까? – BarryM

+0

OK, 프레임의 크기가 조정되었을 때 프레임의 구성 이벤트가 호출되지 않고있는 것을 확인했습니다. 나는 당신의 코드로 또 하나의 함수를 만들고 그것을 자기 (캔버스)에 묶었 다. 코드 줄을 추가하여 프레임의 Configure 이벤트 "self.OnFrameConfigure (self.frame)"을 트리거합니다. 지금은 모두 잘 작동하는 것 같습니다. 감사합니다. 창문에서 프레임까지 이벤트를 물결 치는 더 우아하고 파이썬적인 방법이 있습니까? – BarryM

+0

@ BarryM : 귀하의 의견을 이해하지 못합니다. 원래 코드를 가져 와서 내 대답에 코드를 추가하면 ''이벤트가 제대로 작동합니다. 더 평범한 방법이 있는지 아닌지에 관해서는, 이것이 올바른 방법입니다. –

관련 문제