Python2007.11.28 07:22
간단한 라디오 버튼을 만들어 보자. RadioButton()으로 버튼을 만든다.

RadioButton API ref.: http://www.wxpython.org/docs/api/wx.RadioButton-class.html

사용자 삽입 이미지
#!/usr/bin/env python

"""11-1a. RadioButton """

# http://withrobot.tistory.com
# 2007.11.27

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='RadioButton'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        radio1 = wx.RadioButton(panel,-1,"라디오1",(35,40))
        radio2 = wx.RadioButton(panel,-1,"라디오2",(35,60))
        radio3 = wx.RadioButton(panel,-1,"라디오3",(35,80))
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()
Posted by getcome
Python2007.11.28 07:00
체크 박스의 스타일을 설정함에 따라 3-state 체크 박스을 만들 수 있다. 체크가 안되어 있으면 0, 체크를 하면 1, 3-state 일 때는 2의 상태값을 가진다.

style: wx.CHK_2STATE, wx.CHK_3STATE, wx.CHK_ALLOW_3RD_STATE_FOR_USER

wx.CHK_ALLOW_3RD_STATE_FOR_USER 는 사용자가 직접 3-state 상태를 설정할 수 있고, 이 스타일을 적용하지 않으면 사용자가 3-state를 설정할 수 없고 코딩으로만 설정할 수 있다.
사용자 삽입 이미지

#!/usr/bin/env python

"""10-5c. checkbox """

# http://withrobot.tistory.com
# 2007.11.28

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='CheckBox'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        ck1 = wx.CheckBox(panel,-1,"체크1",(35,40),(150,20))
        ck2 = wx.CheckBox(panel,-1,"체크2",(35,60),(150,20))
        ck3 = wx.CheckBox(panel,-1,"체크3",(35,80),(150,20))
        ck4 = wx.CheckBox(panel,-1,"3-state",(35,120),(150,20),style=wx.CHK_3STATE|wx.CHK_ALLOW_3RD_STATE_FOR_USER)
        ck5 = wx.CheckBox(panel,-1,"체크5",(35,160),(150,20),style=wx.ALIGN_RIGHT)

        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck1)
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck2)
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck3)
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck4)
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck5)
       
        self.st = wx.StaticText(panel,-1, "check",(35,200))
        self.st2 = wx.StaticText(panel,-1, "val", (100,200))
       
    def EvtCheckBox(self, event):
        cb = event.GetEventObject()
        self.st.SetLabel(cb.GetLabelText())
        if cb.Is3State():
            self.st2.SetLabel(str(cb.Get3StateValue()))
        else:
            self.st2.SetLabel(str(cb.IsChecked()))
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()
Posted by getcome
Python2007.11.28 06:31
체크박스 이벤트를 연결해 보자. 체크 박스에 표시가 되어 있는지 확인하려면 IsChecked() 메소드를 이용한다. 체크 박스를 클릭하면 해당 체크 박스 상태 값이 출력되는 예제를 작성해 보자.

사용자 삽입 이미지

"""10-5b. checkbox """

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='CheckBox'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        ck1 = wx.CheckBox(panel,-1,"체크1",(35,40),(150,20))
        ck2 = wx.CheckBox(panel,-1,"체크2",(35,60),(150,20))
        ck3 = wx.CheckBox(panel,-1,"체크3",(35,80),(150,20))
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck1)
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck2)
        self.Bind(wx.EVT_CHECKBOX, self.EvtCheckBox, ck3)
  
        self.st = wx.StaticText(panel,-1, "check",(10,150))
        self.st2 = wx.StaticText(panel,-1, "val", (50,150))
       
    def EvtCheckBox(self, event):
        cb = event.GetEventObject()
        self.st.SetLabel(cb.GetLabelText())
        self.st2.SetLabel(str(cb.IsChecked()))
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()


Posted by getcome
Python2007.11.27 23:40
CheckBox는 문자 레이블을 가지고 있는 토글 버튼이다. 사용자의 선택을 받아들일 때 체크 박스 또는 라디오 버튼을 흔히 사용한다.

CheckBox API reference: http://www.wxpython.org/docs/api/wx.CheckBox-class.html

사용자 삽입 이미지

CheckBox()


#!/usr/bin/env python

"""10-5. checkbox """

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='CheckBox'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        wx.CheckBox(panel,-1,"체크1",(35,40),(150,20))
        wx.CheckBox(panel,-1,"체크2",(35,60),(150,20))
        wx.CheckBox(panel,-1,"체크3",(35,80),(150,20))
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()

Posted by getcome
Python2007.11.27 23:16
화살표 버튼을 클릭해서 숫자를 증감하는 컨트롤러를 스핀 컨트롤러라고 부른다. 이는 SpinButton과 StaticText의 조합이며, wxPython에서는 SpinCtrl()로 합쳐서 제공된다.

SpinCtrl API reference: http://www.wxpython.org/docs/api/wx.SpinCtrl-class.html

사용자 삽입 이미지

SpinCtrl


!/usr/bin/env python

"""10-4. spinner """

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='Spinner(SpinCtrl)'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        sc = wx.SpinCtrl(self,-1,"", pos=(30,50),size=(50,20))
        sc.SetRange(1,100)
        sc.SetValue(10)
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()


SpinCtrl()에서 style을 wx.SP_WRAP으로 설정하면 최대치까지 도달한 후 더 증가시키면 최저치로 되돌아가서 다시 시작된다.  value는 dummy로 empty string을 지정한다.
sc = wx.SpinCtrl(self,-1,"", pos=(30,50),size=(50,20),style=wx.SP_WRAP)
Posted by getcome
Python2007.11.27 12:31
슬라이더를 움직여 값을 설정하면 어떤 동작을 취하고 싶을 때가 있다. 이 때는 EVT_SCROLL_CHANGED 이벤트를 사용하면 된다.

아래 예제는 슬라이더 옆에 StaticText()를 이용해 숫자를 출력하고, 슬라이더를 움직여 설정했을 때 OnDisplayValue() 함수를 실행시켜 설정된 값으로 출력값을 갱신하도록 만들었다. 이 구조를 이용하면 슬라이더를 이용하여 특정 값을 설정했을 때 필요한 작업을 수행할 수 있도록 프로그램을 작성할 수 있을 것이다.
사용자 삽입 이미지

EVT_SCROLL_CHANGED 설정


#!/usr/bin/env python

"""10-3. Slider, EVT_SCROLL_CHANGED 이벤트 사용 """

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='Slider'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)

        self.mySlider = wx.Slider(panel,100,25,1,100,pos=(20,10),size=(250,-1),style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS |wx.SL_LABELS)
        self.mySlider.SetTickFreq(10,1)
        self.myValue = wx.StaticText(panel, -1, str(self.mySlider.GetValue()),pos=(0,30))
        self.Bind(wx.EVT_SCROLL_CHANGED, self.OnDisplayValue)

    def OnDisplayValue(self, event):
        self.myValue.SetLabel(str(self.mySlider.GetValue()))
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()


위 예제에서 비슷한 이벤트 메시지로 EVT_SCROLL_THUMBRELEASE가 있다. 이는 슬라이더의 조정 버튼(thumb)에서 마우스 버튼을 뗄 때 발생하는 이벤트로 기능적으로는 EVT_SCROLL_CHANGED와 같다. 하지만 슬라이더를 마우스가 아니라 키보드로도 조절할 수 있는데, EVT_SCROLL_THUMBRELEASE 를 사용하면 슬라이더 설정값은 바뀌어도 이벤트는 발생하지 않게 된다. 필요에 따라 이 두 이벤트를 적절히 선택하여 사용한다.
Posted by getcome
Python2007.11.27 11:28
앞선 예제에서는 슬라이더의 눈금(tick)이 너무 조밀하게 나와서 별로 예쁘지가 않다. 원하는 간격으로 눈금을 출력하려면 SetTickFreq()를 사용한다.

입력 파라미터는 두 개인데, 첫 번째 것은 간격이고, 두 번째 것은 사용하지 않는 파라미터로 1을 넣으면 된다.

사용자 삽입 이미지

SetTickFreq(10,1) 설정

#!/usr/bin/env python

"""10-2. Slider, tick frequency 설정 """

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='Slider'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)

        mySlider = wx.Slider(panel,100,25,1,100,pos=(10,10),size=(250,-1),style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS |wx.SL_LABELS)
        mySlider.SetTickFreq(10,1)
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()
Posted by getcome
Python2007.11.27 11:06
슬라이더(Slider)는 특정 숫자를 입력하려고 할 때 텍스트 기반으로 입력받지 않고 GUI 형태로 받을 때 유용하다. wxPython에서는 wx.Slider() 함수로 제공된다.

Slider API reference: http://www.wxpython.org/docs/api/wx.Slider-class.html

슬라이더는 입력 파라미터가 무척 많다. 하나씩 살펴보자.
Create(self, parent, id=-1, value=0, minValue=0, maxValue=100, pos=DefaultPosition, size=DefaultSize, style=SL_HORIZONTAL, validator=DefaultValidator, name=SliderNameStr)

value는 슬라이더를 처음 표시할때 시작할 값이다.
min과 max는 슬라이더의 최소치와 최대치 값을 지정하는 것이고, pos, size 역시 포인트 단위로 프레임에서 위치 및 크기를 지정하는 용도의 파라미터이다.

가장 중요한 부분이 style 파라미터인데, 이 인자을 어떻게 설정하느냐에 따라서 다양한 슬라이더를 만들어 낼 수 있다. 들어갈 수 있는 인자를 정리해 보자.

wx.SL_HORIZONTAL: 수평 슬라이더
wx.SL_VERTICAL: 수직 슬라이더
wx.SL_AUTOTICKS: 슬라이더에 눈금 표시
wx.SL_LABELS : 슬라이더 눈금 위에 숫자 표시
wx.SL_LEFT: vertical 슬라이더에서 눈금을 슬라이더 왼쪽에 표시
wx.SL_RIGHT: vertical 슬라이더에서 눈금을 슬라이더 오른쪽에 표시
wx.SL_TOP: horizontal 슬라이더에서 눈금을 슬라이더 윗쪽에 표시

우선 가장 간단한 SL_HORIZONTAL 스타일만 적용하여 슬라이더를 하나 만들자.
사용자 삽입 이미지

Horizontal slider

#!/usr/bin/env python

"""10-1. Slider """

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='Slider'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)

        mySlider = wx.Slider(panel,100,25,1,100,pos=(10,10),size=(250,-1),style=wx.SL_HORIZONTAL)
       
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()


자, 위 슬라이더에 스타일을 적용해 보자
사용자 삽입 이미지

AUTOTICK과 LABELS 스타일을 적용


        mySlider = wx.Slider(panel,100,25,1,100,pos=(10,10),size=(250,-1),style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS |wx.SL_LABELS)
Posted by getcome
Python2007.11.27 08:09
출력한 문자열을 지우려면, SetLabel("")을 사용하면 된다.
앞서 학습한 ToggleButton을 이용해 버튼을 클릭하면 문자열을 지우고, 다시 토글시키면 문자열을 출력하는 예제를 만들어 보자.

사용자 삽입 이미지

초기화면


사용자 삽입 이미지

토글 버튼 클릭시 문자열 대체

사용자 삽입 이미지

문자열 지우기

# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='StaticText'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        text1 = wx.StaticText(panel, -1, "StaticText Example", (50,10),(200,-1),wx.ALIGN_CENTER)
        text1.SetForegroundColour('white')
        text1.SetBackgroundColour('black')

        text2 = wx.StaticText(panel, -1, "좌측 정렬\n""여러 줄에 걸쳐 쓸 수도 있다.""강제로\n줄을 나눌 수도 있다.", (50,40),(95,150),wx.ALIGN_LEFT)
        text2.SetForegroundColour('red')
        text2.SetBackgroundColour('blue')

        self.togglebutton = wx.ToggleButton(panel, label="Toggle button", pos=(150, 200))
        self.Bind(wx.EVT_TOGGLEBUTTON, self.OnToggleButton, self.togglebutton)

        self.str = "우측 정렬\n""여러 줄에 걸쳐 쓸 수도 있다.""강제로\n줄을 나눌 수도 있다."
        self.text3 = wx.StaticText(panel, -1,self.str , (155,40),(95,150),wx.ALIGN_RIGHT)

    def OnToggleButton(self,event):
        if self.togglebutton.GetValue() == 1:
            self.text3.SetLabel("Other Text")        
        else:
            self.text3.SetLabel("")
class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()

Posted by getcome
Python2007.11.27 07:43
StaticText()의 size와 \n 개행 문자를 적절히 사용하면 다단 형태의 여러 줄 문자열을 효과적으로 출력할 수 있다.

사용자 삽입 이미지

여러 줄에 걸쳐 문자열 출력


#!/usr/bin/env python

"""9-6. Static Text multi line"""

# http://withrobot.tistory.com
# 2007.11.26

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None, id=-1, title='StaticText'):
        wx.Frame.__init__(self, parent, id, title, size=(300,300), pos=(100,100) )
        panel = wx.Panel(self)
        text1 = wx.StaticText(panel, -1, "StaticText Example", (50,10),(200,-1),wx.ALIGN_CENTER)
        text1.SetForegroundColour('white')
        text1.SetBackgroundColour('black')

        text2 = wx.StaticText(panel, -1, "좌측 정렬\n""여러 줄에 걸쳐 쓸 수도 있다.""강제로\n줄을 나눌 수도 있다.", (50,40),(95,150),wx.ALIGN_LEFT)
        text2.SetForegroundColour('red')
        text2.SetBackgroundColour('blue')

        text3 = wx.StaticText(panel, -1, "우측 정렬\n""여러 줄에 걸쳐 쓸 수도 있다.""강제로\n줄을 나눌 수도 있다.", (155,40),(95,150),wx.ALIGN_RIGHT)
        text3.SetForegroundColour('yellow')
        text3.SetBackgroundColour('grey')
   

class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()

Posted by getcome