Python2007.12.05 06:25
ComboBox는 일반적으로 CB_DROPDOWN 스타일을 적용하여 드롭 리스트 방식으로 사용한다. 스타일을 CB_SIMPLE로 변경하면 리스트 박스처럼 사용할 수도 있다.

Styles

wx.CB_SIMPLE Creates a combobox with a permanently displayed list. Windows only.
wx.CB_DROPDOWN Creates a combobox with a drop-down list.
wx.CB_READONLY Same as wxCB_DROPDOWN but only the strings specified as the combobox choices can be selected, it is impossible to select (even from a program) a string which is not in the choices list.
wx.CB_SORT Sorts the entries in the list alphabetically.

사용자 삽입 이미지
#!/usr/bin/env python
# -*- coding: cp949 -*-
"""11-5 Combo box: pull-down choice """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']

        self.st = wx.StaticText(panel,-1,"Select one:",(15,20))
        wx.ComboBox(panel,-1,"선택하세요",(15,40),(100,50),sampleList,wx.CB_DROPDOWN)
        wx.ComboBox(panel,-1,"선택하세요",(150,40),(100,50),sampleList,wx.CB_SIMPLE)
       
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.12.05 06:10
실제 프로그래밍을 할 때는 Choice() 클래스를 모두 상속받으면서 추가로 Copy(), Cut(), GetValue() 등 여러 추가 메소드들이 제공되는 Combo Box가 널리 사용된다. MFC에서도 많이 사용되는 콤보 박스와 동일한 기능을 제공한다.

ComboBox API reference: http://www.wxpython.org/docs/api/wx.ComboBox-class.html
사용자 삽입 이미지

#!/usr/bin/env python
# -*- coding: cp949 -*-
"""11-5 Combo box: pull-down choice """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']

        self.st = wx.StaticText(panel,-1,"Select one:",(15,20))
        wx.ComboBox(panel,-1,"선택하세요",(15,40),(100,50),sampleList,wx.CB_DROPDOWN)
       
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.12.05 06:06
Append() 메소드를 사용하면 Choice 목록을 실시간으로 추가할 수 있다. 예제에서는 목록에서 항목을 선택할 때마다 "추가"라는 항목이 들어가도록 하였다.

사용자 삽입 이미지
사용자 삽입 이미지

#!/usr/bin/env python
# -*- coding: cp949 -*-
"""11-4c drop list: append() """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']

        self.st = wx.StaticText(panel,-1,"Select one:",(15,20))
        self.ch = wx.Choice(panel,-1,(85,18),choices=sampleList)
        self.Bind(wx.EVT_CHOICE, self.EvtChoice, self.ch)

    def EvtChoice(self, event):
        self.st.SetLabel(event.GetString())
        self.ch.Append("추가")
       
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.12.05 05:37
Choice()에서 선택하면 EVT_CHOICE 이벤트 메시지가 발생한다. Bind()로 이 메시지를 연결해 주면 Choice()에서 무엇인가를 선택했을 때 발생하는 이벤트를 처리할 수 있다. 아래 예제에서는 목록에서 선택한 항목을 화면의 static text에 출력해 보자.
사용자 삽입 이미지

#!/usr/bin/env python

"""11-4 drop list: pull-down choice """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']

        self.st = wx.StaticText(panel,-1,"Select one:",(15,20))
        self.ch = wx.Choice(panel,-1,(85,18),choices=sampleList)
        self.Bind(wx.EVT_CHOICE, self.EvtChoice, self.ch)

    def EvtChoice(self, event):
        self.st.SetLabel(event.GetString())
       
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.12.05 05:25
목록에서 선택하는 리스트 박스가 편리하긴 하지만 선택할 때만 목록이 pull-down 방식으로 열거됐다가 선택한 후 사라지는 드롭 리스트(drop list) 형식이 편리할 때가 있다. wxPython에서는 wx.Choice()가 이 기능을 지원한다.

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

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

"""11-4 drop list: pull-down choice """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']

        wx.StaticText(panel,-1,"Select one:",(15,20))
        wx.Choice(panel,-1,(85,18),choices=sampleList)
       
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.12.05 05:06
목록에서 선택하는 리스트 박스를 만들어보자. wx.ListBox()를 이용하면 간단히 해결할 수 있다.

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

사용자 삽입 이미지

#!/usr/bin/env python

"""11-3 List box """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']

        listBox = wx.ListBox(panel,-1,(20,20),(80,120),sampleList,wx.LB_SINGLE)
        listBox.SetSelection(0)
       
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.12.04 13:41
자, 이제 라디오 버튼 그룹(RadioBox)를 클릭했을 때 발생하는 이벤트(EVT_RADIOBOX)를 이용해 보자. 다른 경우와 마찬가지로 이벤트가 발생했을 때 실행할 메소드 함수를 Bind()로 연결해 주면 된다. 라디오 박스로 두 그룹의 라디오 버튼들을 생성하고, 각각 그룹별로 클릭할 때 마다 그룹 박스 옆에 선택한 라디오 버튼 번호를 출력하도록 프로그램을 작성해 보자.

사용자 삽입 이미지

#!/usr/bin/env python

"""11-2b RadioBox EVT_RADIOBOX"""

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']
        self.rb1 = wx.RadioBox(panel, -1, "Group A", (10,10), wx.DefaultSize,sampleList,2,wx.RA_SPECIFY_COLS)
        self.rb2 = wx.RadioBox(panel, -1, "Group B", (10,150), wx.DefaultSize,sampleList,3,wx.RA_SPECIFY_COLS)

        self.Bind(wx.EVT_RADIOBOX, self.OnEvtRadioBoxA, self.rb1)
        self.st1 = wx.StaticText(panel, -1,"Group A value",(150,130))

        self.Bind(wx.EVT_RADIOBOX, self.OnEvtRadioBoxB, self.rb2)
        self.st2 = wx.StaticText(panel, -1,"Group B value",(200,220))
       
    def OnEvtRadioBoxA(self, event):
        self.st1.SetLabel(str(self.rb1.GetSelection()))

    def OnEvtRadioBoxB(self, event):
        self.st2.SetLabel(str(self.rb2.GetSelection()))       

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.12.04 08:08
앞서 소개한 방법은 라디오버튼을 만들고, 그리드 컨트롤을 사용하여 라디오 버튼을 배치하고 이를 다시 StaticBox로 감싸서 배치해야 하는 번거로움이 있었다. wxPython에서는 이와 같은 과정을 하나의 함수로 간단하게 설정할 수 있는 컨트롤을 추가로 제공하는데 이것이 바로 RadioBox() 이다.

RadioBox()를 사용하면 다음과 같이 소스가 매우 간결해 진다.

사용자 삽입 이미지

RadioBox를 이용하여 두 개의 라디오 버튼 그룹 생성



#!/usr/bin/env python

"""11-2 RadioBox """

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

import wx

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

        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight']
        wx.RadioBox(panel, -1, "Group A", (10,10), wx.DefaultSize,sampleList,2,wx.RA_SPECIFY_COLS)
        wx.RadioBox(panel, -1, "", (10,150), wx.DefaultSize,sampleList,3,wx.RA_SPECIFY_COLS)       
         
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.12.04 07:57
라디오 버튼은 일반적으로 그룹 단위로 배치되기 마련이다. 그룹으로 묶어서 배치하려면 grid를 이용해 나열하고, 이를 하나의 박스로 묶어서 출력해야 한다. 나름대로 꽤 복잡해 진다.
사용자 삽입 이미지

#!/usr/bin/env python

"""11-1b. 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) )
        #wx.Panel.__init__(self, parent, -1)
        panel = wx.Panel(self)

        #layout controls
        vs = wx.BoxSizer(wx.VERTICAL)   #수직으로 나열
        box1_title = wx.StaticBox(panel,-1,"그룹 1")  #그룹 타이틀, 테두리 지정
        box1 = wx.StaticBoxSizer(box1_title,wx.VERTICAL) #테두리 설정
        grid1 = wx.FlexGridSizer(0,1,0,0) #가로,세로, 간격 지정
       
        radio1 = wx.RadioButton(panel,-1,"라디오1",style=wx.RB_GROUP)
        radio2 = wx.RadioButton(panel,-1,"라디오2")
        radio3 = wx.RadioButton(panel,-1,"라디오3")

        grid1.Add(radio1,0,wx.ALIGN_CENTRE, 5)
        grid1.Add(radio2,0,wx.ALIGN_CENTRE, 5)
        grid1.Add(radio3,0,wx.ALIGN_CENTRE, 5)
       
        box1.Add(grid1,0,wx.ALIGN_CENTRE|wx.ALL,5)
        vs.Add(box1, 0, wx.ALL, 5)

        panel.SetSizer(vs)
        vs.Fit(panel)
       
       
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()

자, 여기서 FlexGridSizer 값을 변경 시키면 배열을 원하는대로 할 수 있다.
버튼을 가로로 나열해 보자.

grid1 = wx.FlexGridSizer(1,0,0,0) #가로,세로, 간격 지정

사용자 삽입 이미지

간격값을 증가시키면 라디오 버튼간의 간격도 조절할 수 있다.
grid1 = wx.FlexGridSizer(0,1,15,0) #가로,세로, 간격 지정

사용자 삽입 이미지

신고
Posted by getcome
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

티스토리 툴바