1. Introduction
Tkinter, PyQt, Kivy와 더불어 Python 주요 GUI 모듈인 wxPython에 대해서 기본적인 사항들을 살펴보겠습니다. Tkinter를 제외하고 나머지 모듈들은 모두 외부 모듈이므로 추가 설치 과정이 필요합니다.
Thonny에서는 비교적 쉽게 설치할 수 있습니다.
1) Menu >> Tools >> Mange packages.. >> 상단 Search on PyPI 검색창에서 키워드 'wxPython'로 검색창에 입력 후 엔터Enter.
2) wxPython (Cross platform GUI toolkit for Python, "Phoenix" version) 이 부분을 클릭하고 설치 과정을 진행하면 빠르게 설치됨(단, 인터넷 연결 필요함).
3) 현재 안정 버전은 "Phoenix" version 4.2.5
Original 표준 Python에서는 wxPython을 다음 두 명령 줄과 같이 설치할 수 있습니다. 한 줄씩 차례대로 CMD창에서 실행하면 됩니다. 한 줄 입력하고 엔터 키, 나머지 한 줄 입력하고 엔터 키.
python -m pip install --upgrade pip setuptools wheel
pip install -U wxPython
# 참고 : 설치 과정
# 참고 : wxPython 표준 기본 Python에 설치하는 과정. CMD 창에서 다음과 같이 실행함.
( CMD창 자체를 실행하는 것은 다음 과정으로.
Windows >> 시작버튼 >> 마우스 오른쪽 버튼 클릭 >> 터미널(관리자) 또는
Windows >> 시작 버튼 >> 마우스 오른쪽 버튼 클릭 >> 실행 >> CMD )
1) 첫 줄
실행 ::
C:\Users\Admin>python -m pip install --upgrade pip setuptools wheel<엔터>
결과 ::
Requirement already satisfied: pip in C:\Python_v3_13_\Lib\site-packages (26.0.1)
Collecting pip
Downloading pip-26.1.1-py3-none-any.whl.metadata (4.6 kB)
Collecting setuptools
Downloading setuptools-82.0.1-py3-none-any.whl.metadata (6.5 kB)
Collecting wheel
Downloading wheel-0.47.0-py3-none-any.whl.metadata (2.3 kB)
Collecting packaging>=24.0 (from wheel)
Downloading packaging-26.2-py3-none-any.whl.metadata (3.5 kB)
Downloading pip-26.1.1-py3-none-any.whl (1.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 8.2 MB/s 0:00:00
Downloading setuptools-82.0.1-py3-none-any.whl (1.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 9.1 MB/s 0:00:00
Downloading wheel-0.47.0-py3-none-any.whl (32 kB)
Downloading packaging-26.2-py3-none-any.whl (100 kB)
Installing collected packages: setuptools, pip, packaging, wheel
Attempting uninstall: pip
Found existing installation: pip 26.0.1
Uninstalling pip-26.0.1:
Successfully uninstalled pip-26.0.1
Successfully installed packaging-26.2 pip-26.1.1 setuptools-82.0.1 wheel-0.47.0
2) 두 번째 줄
실행 ::
C:\Users\Admin>pip install -U wxPython< 엔터>
Collecting wxPython
Downloading wxpython-4.2.5-cp313-cp313-win_amd64.whl.metadata (3.7 kB)
Downloading wxpython-4.2.5-cp313-cp313-win_amd64.whl (16.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.6/16.6 MB 8.3 MB/s 0:00:02
Installing collected packages: wxPython
Successfully installed wxPython-4.2.5
..
..
2. Code
import wx
myApp1 = wx.App()
myFrame1 = wx.Frame(parent=None, title="Hello, James! ^.^;")
myFrame1.Show()
myApp1.MainLoop()
3. Result

4. Notes
1) 비명시적 연결
wx.Frame() 위젯이 어떻게 wx.App()과 연결될까요? 코드 상으로는 아무런 표시가 없어서 다소 이해하기 어렵습니다.
'wx.App()'은 애플리케이션 전체의 실행 환경(이벤트 루프, 초기화, 종료 등)을 관리하고, 'wx.Frame()'은 독립된 최상위 윈도우(창)를 만들어 냅니다. 코드상에 'Frame'과 'App'을 직접 연결하는 명시적 호출이 없어도, 'wx.Frame(parent=None, ...)'로 만든 최상위 창은 'wx.App()'이 관리하는 이벤트 루프에 의해 동작합니다. 자동으로 인식하기 때문입니다. ^.^;
2) 핵심 동작 원리
■ 'wx.App()'
- 애플리케이션 단 하나만 만들어야 하는 싱글톤 성격의 객체입니다.
- 내부적으로 GUI 라이브러리 초기화, 이벤트 루프 준비, 플랫폼별 메시지 펌프 설정 등을 수행합니다.
■ 'wx.Frame(parent=None, ...)'
- 'parent=None'이면 최상위 윈도우(top-level window) 가 됩니다.
- 최상위 윈도우는 운영체제의 창으로 생성되고, 'wx.App'의 이벤트 루프가 이 창으로 들어오는 이벤트(마우스, 키, 윈도우 메시지 등)를 처리하도록 합니다.
■ 'myFrame1.Show()'
창을 화면에 보이게 합니다. (보이지 않으면 이벤트 루프가 있어도 사용자에게 보이지 않음)
■ 'myApp1.MainLoop()'
- 이벤트 루프를 시작합니다. 이 루프가 없으면 창은 생성되더라도 사용자 입력/갱신을 처리하지 못합니다. 즉, 'Frame'은 'App'의 내부 구조에 암묵적으로 등록되어 이벤트 루프의 대상이 되므로 코드상에 'frame.attach(app)' 같은 명시적 연결이 보이지 않는 것입니다.
3) 명시적 연결 방법
- 주 창 지정: 'wx.App()'에 주 창을 명시적으로 알려주고 싶다면 다음과 같이 'SetTopWindow()'를 사용하시면 됩니다.
| 명시적 연결 1 |
| import wx myApp1 = wx.App() myFrame1 = wx.Frame(None, title="Hello, James! ^.^;") myApp1.SetTopWindow( myFrame1 ) # 명시적으로 주 창 설정. 순서상 일단 연결부터 확정하고. myFrame1.Show() # 그 다음에 나타내기. myApp1.MainLoop() # ^.^; # .. |
| Happy Programming! |
■ 'GetTopWindow()'로 가져올 수 있습니다.
GetTopWindow()는 wx.App(또는 wx.Window 계층에서) 현재 애플리케이션에서 가장 먼저 등록된(또는 설정된) 최상위 윈도우를 반환하는 메서드입니다. 즉, wx.App가 알고 있는 “주 창(top window)”을 가져오는 편리한 방법입니다.
■ 언제 유용한가
애플리케이션 전역에서 주 창에 접근해야 할 때 사용합니다.
예: 전역 설정 대화상자를 띄우거나, 모달 대화상자의 부모로 주 창을 지정할 때.
SetTopWindow()로 명시적으로 주 창을 설정해두면 GetTopWindow()가 그 값을 반환합니다. 설정하지 않으면 wx.App가 내부적으로 추적하는 첫 번째 최상위 윈도우(또는 None)를 반환할 수 있습니다.
■ 동작 관계 요약
wx.Frame(parent=None, ...)로 만든 창은 최상위 윈도우가 됩니다.
app.SetTopWindow(frame)로 주 창을 명시하면 app.GetTopWindow()로 언제든지 그 창을 얻을 수 있습니다.
GetTopWindow()는 명시적 연결(attach) 대신 wx.App가 관리하는 주 창 참조를 읽어오는 역할을 합니다.
| 명시적 연결 2 |
import wx myApp1 = wx.App() myFrame1 = wx.Frame(None, title="Hello, James!") myApp1.SetTopWindow(myFrame1) # 주 창으로 설정 myFrame1.Show() top = myApp1.GetTopWindow() print(top.GetTitle()) # "Hello, James!" 출력 myApp1.MainLoop() # ^.^; # .. |
| Happy Programming! |
■ 추가 팁
SetTopWindow()를 호출하지 않아도 동작하지만, 여러 최상위 창이 있을 때 어떤 창을 주 창으로 쓸지 명확히 해두면 코드가 더 안전합니다.
■ GetTopWindow()는 전역 접근용이며, 위젯 간 부모-자식 관계는 여전히 각 위젯의 parent 인자로 관리됩니다. 자식 위젯(패널, 버튼 등)은 'parent=frame'처럼 부모를 명시적으로 전달하여 계층을 만듭니다. 이 경우 이벤트 전파나 레이아웃이 부모-자식 관계를 따릅니다.
■ 이벤트 처리 관점
대부분의 이벤트(버튼 클릭, 창 닫기 등)는 해당 위젯(예: Frame) 에 바인딩된 핸들러로 처리합니다.
'wx.App'에도 전역 수준의 이벤트(예: 'EVT_IDLE')를 바인딩할 수 있지만, 일반적인 위젯 이벤트는 각 위젯에서 처리하는 것이 보통입니다.
■ 주의사항
플랫폼에 따라 'wx.App()'를 먼저 생성해야 하는 경우가 있습니다. (특히 macOS) 안전하게는 'wx.App()' 생성 → 윈도우 생성 → 'Show()' → 'MainLoop()' 순서를 따르세요.
'wx.App'는 하나만 생성하세요. 여러 개 만들면 예기치 않은 동작이 발생합니다.
■ 가장 기본적인 이벤트 핸들러 처리 방법
| 이벤트 핸들러 |
import wx myApp1 = wx.App() myFrame1 = wx.Frame(None, title="Hello, James!") myApp1.SetTopWindow(myFrame1) # 주 창으로 설정 myFrame1.Show() top = myApp1.GetTopWindow() print(top.GetTitle()) # "Hello, James!" 출력 def onMouseBtn1Down(event): myFrame1.SetBackgroundColour(wx.Colour(0, 0, 255, 50)) # 마지막 값은 알파값임. 0이면 아예 안 보임. myFrame1.Refresh() def onMouseBtn2Down(event): myFrame1.SetBackgroundColour(wx.Colour(255, 0, 0, 50)) # 마지막 값은 알파값임. 0이면 아예 안 보임. myFrame1.Refresh() myFrame1.Bind(wx.EVT_LEFT_DOWN, onMouseBtn1Down) myFrame1.Bind(wx.EVT_RIGHT_DOWN, onMouseBtn2Down) # Happy Programming! # ^.^; |
| [ wxPython_Ex_003_.py ] |
■ 응용 연습 과제
1) 윈도우 타이틀 바꾸기
2) 윈도우 크기 지정하기
5. Files
6. Ref.
1) wxPython 공식 내장 도움말
2) 박상현. [ 뇌를 자극하는 파이썬 3 ] 한빛미디어. 2016. 서울.
3) CoPilot.Mode.ThinkDeeper.
Happy Programming!
^.^;
'Programming > Python' 카테고리의 다른 글
| 스파이더(Spyder) IDE에서 pip 및 pygame 설치 - 001 (0) | 2026.04.04 |
|---|---|
| 스파이더Spyder IDE 공식 다운로드 링크 및 거북이 세 마리 실험 (0) | 2026.04.02 |
| Python 실행 환경 기초 - 001 - CMD 창에서 실행하기 (0) | 2026.04.01 |
| Python Basic : Tuple (0) | 2026.01.19 |
| Python 3D - Panda3D SDK(v1.10.15) 설치 및 테스트 (0) | 2025.12.20 |