반응형

1. 시험환경

    · python v3.7.2 (64 bit)

    · wxPython

 

2. 목적

    · pip를 이용하여 wxPython 라이브러리를 설치한다.

    · wxPython 윈도우/속성/메뉴 생성 등 기본 사용법을 알아보자.

 

3. 적용

    ①  pip를 이용하여 wxPython 라이브러리를 설치한다.

        - pip 업데이트를 진행한다: pip  -m  pip  install  -upgrade  pip

 

        - wxPython 라이브러리를 설치한다: pip  install  wxPython

 

        -  정상 설치 여부를 확인한다: python 프롬프트에서 import wx 실행

 

 

    ② wx.Frame을 이용한 Window 생성 예제

        - 파일명: 01_wxFrame_basic.py

1
2
3
4
5
6
7
8
9
import wx
 
app = wx.App()
 
frame = wx.Frame(None-1"Hello World!")
frame.Show()
 
app.MainLoop()
 
cs

 

        - 결과) “Hello World!”라는 title 갖는 window 생성

01_wxFrame_basic.py 실행화면

 

 

    ③ wx.Frame 속성을 적용한 Window 생성

        - 파일명: 02_wxFrame_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import wx
 
#    SetSize(width, height) : wx.Frame의 “가로 x 세로” 크기 설정
#    SetBackgroundColour(“color”) : wx.Frame 배경색 설정
#    CreateStatusBar() : 상태 표시줄 설정
#    Centre() : 화면 가운데 위치로 윈도우 이동
#    Move(wx.Point point) : 설정값 위치로 윈도우 이동
#    MoveXY(int x, int y) : 설정 좌표로 윈도우 이동
#    SetPosition(wx.Point point) : 윈도우의 위치 설정
#    SetDimensions(x, y, width, height, sizeFlags) : 윈도우의 위치와 크기 설정
 
class WxFrame_Setting(wx.Frame):
 
    def __init__(self, parent, title):
        super().__init__(parent, title = title)
        self.SetSize(600400)
        self.SetBackgroundColour("gray")
        self.CreateStatusBar()
        self.Centre()
        self.Show()
 
 
if __name__ == "__main__":
    app = wx.App()
    WxFrame_Setting(None, title = "wx.Frame Setting")
    app.MainLoop()
cs

 

 

        - 결과) 설정이 반영된 윈도우 화면

02_wxFrame_setting.py 실행화면

 

    ④ wx.Menu 속성을 이용한 메뉴 구성 예제

        - 파일명: 03_menu_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import wx
 
# wx.MenuBar : wx.Frame 상단에 위치한 메뉴를 구성하는 Bar
# wx.Menu : 메뉴에 기본적으로 나타나는 항목
# wx.MenuItem : wx.Menu 클릭시 나타나는 메뉴 항목
 
class wxMenu_setting(wx.Frame):
 
    def __init__(self, parent, title):
        super().__init__(parent, title = title)
        self.SetSize(600400)
        self.SetBackgroundColour("gray")
        self.CreateStatusBar()
        self.Centre()
 
        menu = wx.Menu()
        menu.Append(wx.ID_ABOUT, "About""description_1 in status bar")
        menu.AppendSeparator()
        Exit_ = menu.Append(wx.ID_EXIT, "Exit\tCtrl+E""description_2 in status bar")
        self.Bind(wx.EVT_MENU, self.evt_exit_click, Exit_)
 
        menuBar = wx.MenuBar()
        menuBar.Append(menu, "&File")
 
        self.SetMenuBar(menuBar)
        self.Show()
 
 
    # binding function
    def evt_exit_click(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_setting(None"wx.Menu setting")
    app.MainLoop()
 
cs

 

        - 결과) 설정 메뉴 확인 <Alt> 누르면 코드에서 지정한 단축키가 밑줄로 표시

 

 

    ⑤ Sub Menu 구성 예제

        - 파일명: 04_wxMenu_SubMenu_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import wx
 
# 동일한 서브메뉴를 구성하는 항목들은 동일한 ID로 설정해야 한다.
class wxMenu_SubMenu_setting(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
 
    def createWidget(self):
        menu = wx.Menu()
        menu.Append(wx.ID_NEW, "&New")
        menu.Append(wx.ID_OPEN, "&Open")
        menu.Append(wx.ID_SAVE, "&Save")
 
        menu.AppendSeparator()
 
        subMenu = wx.Menu()
        subMenu.Append(wx.ID_ANY, "Import File")
        subMenu.Append(wx.ID_ANY, "Import Image")
        subMenu.Append(wx.ID_ANY, "Export File")
 
        menu.Append(wx.ID_ANY, "Import/Export", subMenu)
 
        Exit_ = menu.Append(wx.ID_EXIT, "&Exit")
        self.Bind(wx.EVT_MENU, self.evt_exit_click, Exit_)
 
        menuBar = wx.MenuBar()
        menuBar.Append(menu, "&Menu1")
 
        self.SetMenuBar(menuBar)
 
        self.Show(True)
 
 
    def evt_exit_click(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_SubMenu_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) 메뉴 서브메뉴 구성 확인

04_wxMenu_SubMenu_setting.py 실행화면

 

    ⑥ Check Menu 구성 예제

        - 파일명: 05_wxMenu_Check_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import wx
 
#     menu item 생성시 wx.ITEM_CHECK 속성을 이용하여 check menu로 설정
class wxMenu_Check_setting(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
    def createWidget(self):
 
        menuBar = wx.MenuBar()
 
        # 1. File Menu
        m_file = wx.Menu()
        menuBar.Append(m_file, "&File")
 
        # 2. View Menu
        m_view = wx.Menu()
 
        # kind: Menu Type parameter
        # wx.ITEM_NORMAL(default), wx.ITEM_CHECK(check menu)
        self.show_tb = m_view.Append(wx.ID_ANY, "툴바 보기""툴바 ON/OFF", kind = wx.ITEM_CHECK)
        self.show_sb = m_view.Append(wx.ID_ANY, "상태바 보기""상태바 ON/OFF", kind = wx.ITEM_CHECK)
        
        # Default Set : ToolBar(Checked), StatusBar(Checked)
        m_view.Check(self.show_tb.GetId(), True)
        m_view.Check(self.show_sb.GetId(), True)
        
        # Binding event function
        self.Bind(wx.EVT_MENU, self.toolbar_click, self.show_tb)
        self.Bind(wx.EVT_MENU, self.statusbar_click, self.show_sb)
        
        menuBar.Append(m_view, "&View")
 
        self.SetMenuBar(menuBar)
 
        self.toolbar = self.CreateToolBar()
 
        self.statusBar = self.CreateStatusBar()
        self.statusBar.SetStatusText("Ready")
 
        self.Show(True)
 
 
    def toolbar_click(self, e):
        if self.show_tb.IsChecked():
            self.toolbar.Show()
        else:
            self.toolbar.Hide()
 
 
    def statusbar_click(self, e):
        if self.show_sb.IsChecked():
            self.statusBar.Show()
        else:
            self.statusBar.Hide()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_Check_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) 체크 메뉴 선택에 따른 툴바 상태바 ON/OFF 기능

 

 

    ⑦ Pop-Up Menu 예제

        - 파일명: 07_wxMenu_PopUp_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import wx
 
#     MenuItem 클래스를 이용한 Pop-Up Menu 구성
class PopupMenu_setting(wx.Menu):
 
    def __init__(self, parent):
        super().__init__()
        self.parent = parent
 
        m_minimize = wx.MenuItem(self, wx.NewId(), "최소화")
        self.Append(m_minimize)
        self.Bind(wx.EVT_MENU, self.exec_minimize_func, m_minimize)
 
        m_exit = wx.MenuItem(self, wx.NewId(), "종료")
        self.Append(m_exit)
        self.Bind(wx.EVT_MENU, self.exec_exit_func, m_exit)
 
    def exec_minimize_func(self, e):
        self.parent.Iconize()
 
    def exec_exit_func(self, e):
        self.parent.Close()
 
        
class WinFrame(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
    def createWidget(self):
        # 1. Event : right click on mouse
        self.Bind(wx.EVT_RIGHT_DOWN, self.exec_right_down_func)
        self.Show(True)
 
    # Binding Function
    def exec_right_down_func(self, e):
        # 2. get the position(x, y) on the screen and show your definded popoup menu
        self.PopupMenu(PopupMenu_setting(self), e.GetPosition())
 
    def main():
        app = wx.App()
        WinFrame(None)
        app.MainLoop()
 
 
if __name__ == "__main__":
    WinFrame.main()
 
cs

 

        - 결과) 마우스 우클릭시 나타나는 팝업 메뉴 구성 기능 확인

07_wxMenu_PopUp_setting.py 실행화면

 

    ⑧ ToolBar Icon 구성 예제

        - 파일명: 08_Toolbar_Icon_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import wx
 
class Toolbar_Icon_setting(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
    def createWidget(self):
 
        # Create a ToolBar in wx.Frame
        # CreateToolBar()를 이용하여 생성된 ToolBar에 Icon 이미지 및 기능 추가
        tb = self.CreateToolBar()
 
        # Insert icon image into the ToolBar
        Exit_ = tb.AddTool(wx.ID_ANY, "Exit", wx.Bitmap("icon_image/icon_01.jpg"))
        self.Bind(wx.EVT_TOOL, self.exec_exit_func, Exit_)
 
        # essential code to show icon image for Win/Mac
        tb.Realize()
 
        self.Show(True)
 
    def exec_exit_func(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_Icon_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) ToolBar 추가된 Icon 이미지 기능 확인

08_Toolbar_Icon_setting.py 실행화면

 

    ⑨ Multiple ToolBar Icon 예제

        - 파일명: 09_Toolbar_Multiple_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import wx
 
# 여러 개의 ToolBar를 사용하여 wx.Frame에 배치하는 경우, 겹쳐서 표현되는 문제를 해결해야 함
# wx.BoxSizer(wx.VERTICAL|wx.HORIZONTAL) : wx.Frame을 구획
# Add(ToolBar 객체, 구획비율, wx.EXPAND) : WindowFrame에 설정값으로 ToolBar 추가
class Toolbar_Multiple_setting(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
    def createWidget(self):
 
        # Use wx.ToolBar() instread of wx.CreateToolBar() to create Multiple ToolBar
        tb1 = wx.ToolBar(self)
        tb1.AddTool(wx.ID_ANY, "New", wx.Bitmap("icon_image/new.png"))
        tb1.AddTool(wx.ID_ANY, "Open", wx.Bitmap("icon_image/open.png"))
        tb1.AddTool(wx.ID_ANY, "Save", wx.Bitmap("icon_image/save.png"))
        tb1.Realize()
 
        # Use wx.ToolBar() instread of wx.CreateToolBar() to create Multiple ToolBar
        tb2 = wx.ToolBar(self)
        Exit_ = tb2.AddTool(wx.ID_ANY, "Exit", wx.Bitmap("icon_image/icon_01.jpg"))
        self.Bind(wx.EVT_TOOL, self.exec_exit_func, Exit_)
        tb2.Realize()
 
        # Set horizontal position of ToolBars in wx.Frame
        hBox = wx.BoxSizer(wx.HORIZONTAL)
        hBox.Add(tb1, 2, wx.EXPAND)
        hBox.Add(tb2, 1, wx.EXPAND)
        self.SetSizer(hBox)
 
        '''
        # Set vertical position of ToolBars in wx.Frame
        vBox = wx.BoxSizer(wx.VERTICAL)
        vBox.Add(tb1, 0, wx.EXPAND)
        vBox.Add(tb2, 0, wx.EXPAND)
        self.SetSizer(vBox)
        '''
        self.Show(True)
 
 
    def exec_exit_func(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_Multiple_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) wx.HORIZONTAL/wx.VERTICAL 구획비율을 변경하며 테스트

09_Toolbar_Multiple_setting.py 실행화면

 

    ⑩ ToolBar의 아이콘(버튼) 활성/비활성 제어

        - 파일명: 10_Toolbar_icon_active_nonactive.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import wx
 
# EnableTool(“object ID”, True | False)
class Toolbar_icon_Act_NonAct(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
 
    def createWidget(self):
        self.count = 5
 
        self.toolbar = self.CreateToolBar()
        toolbar_undo = self.toolbar.AddTool(wx.ID_UNDO, 'undo', wx.Bitmap('icon_image/undo.png'))
        toolbar_redo = self.toolbar.AddTool(wx.ID_REDO, 'redo', wx.Bitmap('icon_image/redo.png'))
 
        self.toolbar.AddSeparator()
 
        toolbar_exit = self.toolbar.AddTool(wx.ID_EXIT, 'exit', wx.Bitmap('icon_image/exit.png'))
 
        self.Bind(wx.EVT_TOOL, self.onUndo, toolbar_undo)
        self.Bind(wx.EVT_TOOL, self.onRedo, toolbar_redo)
        self.Bind(wx.EVT_TOOL, self.onExit, toolbar_exit)
 
        self.toolbar.Realize()
 
        self.Show(True)
 
 
    def onUndo(self, e):
        if self.count > 1 and self.count <= 5:
            self.count -= 1
        elif self.count == 1:
            self.toolbar.EnableTool(wx.ID_UNDO, False)
        elif self.count == 4:
            self.toolbar.EnableTool(wx.ID_REDO, True)
 
 
    def onRedo(self, e):
        if self.count >= 1 and self.count < 5:
            self.count += 1
        elif self.count == 5:
            self.toolbar.EnableTool(wx.ID_REDO, False)
        elif self.count == 2:
            self.toolbar.EnableTool(wx.ID_UNDO, True)
 
 
    def onExit(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_icon_Act_NonAct(None)
    app.MainLoop()
 
cs

 

        - 결과) ToolBar 버튼 활성화/비활성화

 

4. 결과

    · 소스코드 파일첨부

Python_GUI_wxPython.zip
0.02MB

 

 

반응형

+ Recent posts