사용자 도구


wxPython

레이아웃 구성

wx.BoxSizer

레이아웃 구성의 가장 기본이 되는 레이아웃 관리자

layout.py
# -*- coding: utf-8 -*-
 
#!/usr/bin/python
 
# layout3.py
 
import wx
 
class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(450, 300))
 
        panel = wx.Panel(self, -1)
        box = wx.BoxSizer(wx.HORIZONTAL)
        box.Add(wx.Button(panel, -1, 'Button1'), 1, wx.ALL, 5)
        box.Add(wx.Button(panel, -1, 'Button2'), 0, wx.EXPAND|wx.RIGHT|wx.TOP, 5)
        box.Add(wx.Button(panel, -1, 'Button3'), 0, wx.ALIGN_CENTER)
        panel.SetSizer(box)
        self.Centre()
 
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'layout.py')
        frame.Show(True)
        return True
 
app = MyApp(0)
app.MainLoop()

결과

Add함수의 2번째 parameter는 위젯이 차지할 영역의 비율이다. 이 값이 0이면 원래 크기 그대로 쓰겠다는 것이다. 위 결과에서는 비율이 0인 버튼이 차지하는 영역을 제외한 나머지 영역을 첫 번째 버튼이 다 차지하고 있다. Add함수의 3번째 parameter에 wx.ALL, wx.RIGHT, wx.EXPAND 등의 인자가 보이는데 이것은 배치를 결정하거나(wx.ALIGN_XXX 값) border(비어 있는 영역)을 지정할 방향을 지정한다. wx.EXPAND값은 위젯 배치하고 남은 영역 중 해당 위젯이 쓸 수 있는 영역을 다 쓰겠다는 것이다. 위 예제의 두 번째 버튼 추가하는 부분에서 wx.EXPAND을 없애면 아래와 같이 변한다.

wx.EXPAND 제거

프로그램 환경 설정

wxPython은 프로그램의 환경 설정을 저장하고 불러올 수 있는 기능도 제공한다. 리눅스에서는 홈디렉토리(디폴트 설정인 경우)의 숨김 파일에 환경 설정이 저장되고 윈도우에서는 레지스트리에 환경 설정이 저장된다. 환경 설정과 관련된 wx.Config 클래스가 담당한다. wx.Config의 메소드는 아래 참고의 링크를 참고하고 여기서는 간단히 예제만 살펴보자.

myconfig.py
# -*- coding: utf-8 -*-
 
#!/usr/bin/python
 
# myconfig.py
 
import wx
 
class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        self.cfg = wx.Config('myconfig')
        if self.cfg.Exists('width'):
            w, h = self.cfg.ReadInt('width'), self.cfg.ReadInt('height')
        else:
            (w, h) = (250, 250)
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(w, h))
 
        wx.StaticText(self, -1, 'Width:', (20, 20))
        wx.StaticText(self, -1, 'Height:', (20, 70))
        self.sc1 = wx.SpinCtrl(self, -1, str(w), (80, 15), (60, -1), min=200, max=500)
        self.sc2 = wx.SpinCtrl(self, -1, str(h), (80, 65), (60, -1), min=200, max=500)
        wx.Button(self, 1, 'Save', (20, 120))
 
        self.Bind(wx.EVT_BUTTON, self.OnSave, id=1)
        self.statusbar = self.CreateStatusBar()
        self.Centre()
 
    def OnSave(self, event):
        self.cfg.WriteInt("width", self.sc1.GetValue())
        self.cfg.WriteInt("height", self.sc2.GetValue())
        self.statusbar.SetStatusText('Configuration saved, %s ' % wx.Now())
 
 
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'myconfig.py')
        frame.Show(True)
        self.SetTopWindow(frame)
        return True
 
app = MyApp(0)
app.MainLoop()

먼저 wx.Config의 생성자를 통해 myconfig라는 환경 설정을 읽어들이거나 생성한다. 그리고 Exists 메소드를 통해 width라는 속성이 존재하면 ReadInt 메소드를 통해 width, height 속성의 값을 정수로 읽어 들인다. 마지막으로 Save 버튼을 클릭하면 sc1, sc2 의 값을 읽어 들인 후 WriteInt 메소드를 통해 값을 저장한다.

참고