2015-02-03 3 views
0

wxPython에서 고정 세로 세로 비율로 작성한 하위 패널을 가운데에 정렬하는 데 문제가 있습니다.가로 세로 비율이 조절 된 가운데 패널을 사용하는 방법

가로 세로 비율을 제어하려면 하위 패널에서 Size 이벤트를 캡처 한 다음 명시적인 SetSize를 수행해야합니다. 그래서, 나는 그것을했고 잘 작동합니다. 불행히도이 하위 패널을 다른 패널 (사이퍼 사용)에 포함하면 wx.ALIGN_CENTER_HORIZONTAL 플래그가 작동하지 않습니다.

사이퍼는 내 하위 패널에 전체 너비가 맞는지 알려줍니다. 내 윈도우가 전체 너비를 사용하지 않으면 사이 저는 조정되지 않습니다.

import wx 

ROWS = 6 
COLS = 25 

class TestPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 

     label = wx.StaticText(self, -1, 'Label') 
     grid = TestGrid(self) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(label, 0, flag=wx.ALIGN_CENTER_HORIZONTAL) 
     sizer.Add(grid, 1, flag=wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND) 
     self.SetSizer(sizer) 

class TestGrid(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 
     self.SetBackgroundColour(wx.BLUE) 
     self.Bind(wx.EVT_SIZE, self.OnSize) 

    def OnSize(self, event): 
     w, h = self.GetSizeTuple() 
     delta = min(w // COLS, h // ROWS) 
     self.SetSize((COLS*delta, ROWS*delta)) 
     self.Refresh() 

if __name__ == '__main__': 
    app = wx.App() 
    frame = wx.Frame(None, -1, "Test", size=(600, 200)) 
    panel = TestPanel(frame) 
    frame.Show(True) 
    app.MainLoop() 

이 화면 캡처입니다 : Demonstration of problem

답변

0

VZ가 그의 대답에서 설명한 것처럼 wxEVT_SIZE 처리기는 그리 좋은 생각이 아닙니다. 그것을 제거하십시오. sizer를 사용할 때는 원하는 것을 얻기 위해 sizer 인프라 내에서 작업해야합니다.

특정 가로 세로 비율을 유지하면서 TestGrid이 부모 내에 가능한 한 많은 공간을 채우 길 원합니다. 그게 바로 wx.SHAPED입니다 (이미 가지고있는 proportion과 결합하여 0보다 큽니다). 그래서, 당신은이 같은 선별기에 grid을 추가해야합니다 :

sizer.Add(grid, 1, flag=wx.ALIGN_CENTER_HORIZONTAL|wx.SHAPED) 

당신이해야 할 유일한 다른 점은 원하는 화면 비율이 무엇인지 사이 저에게 있습니다. 가장 쉬운 방법은 TestGrid의 초기 크기를 설정하는 것입니다 (크기가 조정기에 추가되기 전에). 모든 작업이 완료

wx.Panel.__init__(self, parent, -1, size=(COLS*7, ROWS*7)) 

: 예를 들어, 그 wxPanel베이스의 크기를 설정합니다.

(필자는 파이썬 구문을 추측하므로 모든 명백한 오류를 무시합니다 .-))

+0

훌륭함 - 완벽하게 작동했습니다! – user2483736

0

당신은 할 수없는, 또는 적어도,에서 창 크기를 조정하지 말아야 여기에 문제를 보여줍니다 내 코드의 단순화 된 버전입니다 자신의 wxEVT_SIZE 처리기. 정확히 무엇을 달성하려고하는지 잘 모르겠지만, 목표가 TestGrid 클래스의 모든 것을 캡슐화하는 것이라면, 크기가 어느 것이 든 갖고 있어야하며, 적절한 크기로 크기를 조정할 중첩 된 창을 만들어야합니다. OnSize에 있습니다.