본문 바로가기
Programming/Python

wx.Sizer()

by The Programmer 2026. 9. 20.

1. Introduction

 

요약 :

1) Sizer는 Panel처럼 컨테이너입니다.
2) Sizer는 배치관리자 역할을 합니다.
3) Sizer는 수직, 수평 배치를 할 수 있습니다. 상수(Constant), wx.VERTICAL, wx.HORIZONTAL을 사용.
4) Sizer는 추상 기반 클래스입니다.
5) Sizer는 파생클래스 형태로 사용해야 합니다. Sizer라고 할 때, 이들 파생 클래스를 의미함.

(wx.BoxSizer, wx.StaticBoxSizer, wx.GridSizer, wx.FlexGridSizer)
6) 객체.SetSizer()
7) 객체.Add()
8) Add() 옵션들
9) 전체적인 GUI 구성 방법
- wx.App() 안에 wx.Frame()
- wx.Frame() 안에 wx.Panel()
- wx.Panel() 안에 wx.Sizer()
- wx.Sizer() 안에 각종 GUI 객체들. (예 : 버튼)

 

 

 

2. Code

 

2.1 기본 코드


import wx

app = wx.App()

frame = wx.Frame(None, title="Sizer Example")

 

panel = wx.Panel(frame)

sizer = wx.BoxSizer(wx.VERTICAL)  # wx.VERTICAL 상수를 사용하여 수직 방향 지정

 

btn1 = wx.Button(panel, label="Button 1")

btn2 = wx.Button(panel, label="Button 2")

btn3 = wx.Button(panel, label="Button 3")

btn4 = wx.Button(panel, label="Button 4")

btn5 = wx.Button(panel, label="Button 5")

btn6 = wx.Button(panel, label="Button 6")

 

sizer.Add(btn1, 0, wx.ALL, 5)

sizer.Add(btn2, 0, wx.ALL, 5)

sizer.Add(btn3, 0, wx.ALL, 5)

sizer.Add(btn4, 0, wx.ALL, 5)

sizer.Add(btn5, 0, wx.ALL, 5)

sizer.Add(btn6, 0, wx.ALL, 5)

 

panel.SetSizer(sizer)

 

frame.Show()

app.MainLoop()

 

"""

......

 

"""

 

2.2 코드

 

 

3. Result

 

 

 

4. Notes

Not yet! ^.^;

 

■ 2.1 코드 해설 :

 

Sizer.Add(btn1, 0, wx.ALL, 5)에서 마지막에 있는 숫자 5는 여백(margin, padding)의 크기를 의미합니다.

 

세부적인 설명 : 


Sizer.Add() 메서드는 위젯을 Sizer에 추가할 때 여러 인자를 받습니다.
네 번째 인자인 5는 여백(margin) 크기를 픽셀 단위로 지정합니다.
이 여백은 wx.ALL 플래그와 함께 사용되어, 위젯의 모든 방향(위, 아래, 왼쪽, 오른쪽)에 5픽셀의 여백을 줍니다.
즉, wx.ALL은 모든 방향에 여백을 적용하라는 의미이고, 5는 그 여백의 크기입니다.

예시 :


pythonsizer.Add(btn1, 0, wx.ALL, 5)


btn1 버튼을 Sizer에 추가
비율(비율 인자) 0: 크기 조절 시 공간을 차지하는 비율 (0은 고정 크기)
wx.ALL: 모든 방향에 여백 적용
5: 여백 크기 5픽셀

 

Sizer.Add() 메서드
인자위치 의미 예시값 설명
1번째 인자 추가할 위젯 btn1 Sizer에 추가할 컨트롤 (=위젯)
2번째 인자 비율 0 공간 배분 비율 (0은 고정 크기)
3번째 인자 플래그 wx.ALL 여백 적용 방향 (모든 방향)
4번째 인자 여백 크기 5 픽셀 단위 여백 크기

 

 

1) 수직, 수평 상수(Constant) :

 

wxPython에서 Sizer를 사용할 때 wx.VERTICAL과 wx.HORIZONTAL은 상수(Constant)로 정의되어 있습니다. wx.VERTICAL과 wx.HORIZONTAL은 wxPython 라이브러리 내에서 방향을 지정할 때 사용하는 상수입니다. 이 상수들은 주로 wx.BoxSizer 같은 레이아웃 관리자의 방향을 지정하는 데 사용됩니다. 예를 들어, wx.BoxSizer(wx.VERTICAL)는 위젯들을 수직 방향으로 배치하고, wx.BoxSizer(wx.HORIZONTAL)는 수평 방향으로 배치합니다. 이 값들은 내부적으로 정수형 상수로 정의되어 있으며, wxPython의 C++ 기반 wxWidgets 라이브러리에서 상속된 값들입니다.

 

 

2) 추상 기반 클래스 :

 

■ 추상 기반 클래스의 개념

더보기

추상 기반 클래스(Abstract Base Class, ABC)의 개념

 

a. 기본 개념
추상 기반 클래스는 객체지향 프로그래밍에서 직접 인스턴스를 생성할 수 없는 클래스를 의미합니다. 즉, 추상 클래스 자체는 완전한 구현을 제공하지 않고, 주로 다른 클래스들이 상속받아 구체적인 기능을 구현하도록 설계된 "틀" 또는 "청사진" 역할을 합니다.

추상 클래스는 하나 이상의 추상 메서드(구현이 없는 메서드)를 포함할 수 있습니다. 이 추상 메서드는 서브클래스에서 반드시 구현해야 합니다. 추상 클래스는 공통 인터페이스(메서드, 속성 등)를 정의하여, 이를 상속받는 모든 클래스가 일정한 규격을 따르도록 강제합니다.

b. 왜 추상 기반 클래스를 사용하는가?
- 코드 재사용과 일관성 유지 : 여러 클래스가 공통적으로 가져야 할 기능이나 인터페이스를 추상 클래스에 정의해 두면, 서브클래스들이 이를 공유하면서도 각자의 특성에 맞게 구체화할 수 있습니다.

- 설계 명확화 : 추상 클래스는 개발자에게 "이 클래스는 직접 사용하지 말고, 반드시 상속받아 구현하라"는 의도를 명확히 전달합니다.
- 다형성 지원 : 추상 클래스 타입으로 여러 서브클래스 객체를 다룰 수 있어, 코드의 유연성과 확장성을 높입니다.

c. 추상 기반 클래스의 특징
- 인스턴스 생성 불가 : 추상 클래스는 직접 객체를 만들 수 없습니다.
- 추상 메서드 포함 : 구현이 없는 메서드를 포함하며, 서브클래스에서 반드시 구현해야 합니다.
- 일부 메서드 구현 가능: 추상 클래스 내에 기본 구현이 있는 메서드도 포함할 수 있어, 서브클래스가 필요에 따라 재정의할 수 있습니다.
- 인터페이스 역할 : 클래스들이 따라야 할 규약(메서드 시그니처 등)을 정의합니다.

d. wxPython의 wx.Sizer와 추상 클래스
wx.Sizer는 추상 기반 클래스입니다. 직접 인스턴스를 만들 수 없고, 구체적인 레이아웃 동작을 위해 wx.BoxSizer, wx.GridSizer 등으로 상속받아 사용합니다. wx.Sizer는 공통 인터페이스(예: 위젯 추가, 레이아웃 계산 등)를 정의하여, 다양한 Sizer들이 일관된 방식으로 동작하도록 합니다.
 

추상 기반 클래스 개념 요약
구분 설명
추상 기반 클래스란? 직접 인스턴스를 만들 수 없고, 서브클래스가 구현해야 할 메서드를 포함하는 클래스
목적 공통 인터페이스 정의, 코드 재사용, 설계 명확화, 다형성 지원
특징 인스턴스 생성 불가, 추상 메서드 포함, 일부 메서드 구현 가능
wx.Sizer 추상 기반 클래스, 구체적인 레이아웃 Sizer들이 상속받아 사용


추상 기반 클래스는 객체지향 설계에서 매우 중요한 개념으로, 복잡한 시스템에서 일관성과 확장성을 유지하는 데 핵심적인 역할을 합니다.

.

.

 

wxPython에서 wx.Sizer는 추상 기반 클래스(abstract base class)입니다. wx.Sizer는 윈도우 내의 하위 윈도우(위젯)들을 배치하기 위한 기본 추상 클래스입니다. 직접 wx.Sizer 인스턴스를 생성하여 사용할 수 없으며, 대신 wx.BoxSizer, wx.GridSizer, wx.FlexGridSizer 등과 같은 구체적인 서브클래스를 사용해야 합니다. 이 클래스는 레이아웃 관리의 기본 인터페이스와 공통 기능을 정의하고, 실제 배치 동작은 서브클래스에서 구현됩니다. 즉, wx.Sizer는 추상 클래스 역할을 하며, 구체적인 레이아웃을 위해서는 이를 상속한 다른 Sizer 클래스를 사용해야 합니다.

 

 

■ Sizer는 파생클래스 형태로 사용해야 합니다

더보기

"Sizer는 파생클래스 형태로 사용해야 합니다"에 대한 보충 설명

 

1. Sizer의 기본 개념
wx.Sizer는 wxPython에서 레이아웃 관리를 위한 추상 기반 클래스입니다.
추상 클래스이기 때문에 직접 인스턴스를 생성해서 사용할 수 없습니다.
대신, wx.Sizer를 상속받아 구체적인 레이아웃 동작을 구현한 파생(서브) 클래스를 사용해야 합니다.

 

2. 파생클래스란?
파생클래스(=서브클래스)는 기존 클래스(=기반클래스, 슈퍼클래스)를 상속받아 기능을 확장하거나 구체화한 클래스입니다.
wx.Sizer는 추상적인 레이아웃 인터페이스를 제공하고, 실제 동작은 파생클래스가 구현합니다.

 

3. wxPython에서 대표적인 Sizer 파생클래스 예

wx.BoxSizer : 위젯들을 수평(wx.HORIZONTAL) 또는 수직(wx.VERTICAL) 방향으로 배치
wx.GridSizer : 위젯들을 격자(grid) 형태로 배치
wx.FlexGridSizer : 크기가 유동적인 격자 형태 배치
wx.GridBagSizer : 격자 내에서 복잡한 위치 지정 가능

 

4. 왜 파생클래스를 사용해야 하는가?
wx.Sizer는 추상 클래스이므로 직접 사용할 수 없고, 구체적인 레이아웃 방식이 구현되어 있지 않습니다.
파생클래스들은 각기 다른 레이아웃 알고리즘과 동작 방식을 구현하여, 개발자가 원하는 배치 방식을 선택할 수 있게 합니다.
따라서, 레이아웃을 만들 때는 반드시 wx.Sizer를 상속받은 구체적인 클래스를 생성하여 사용해야 합니다.

.

.

 

5. wxPython Sizer의 파생클래스(derived classes)에 대한 추가 설명 :

wx.Sizer는 추상 기반 클래스이며, 실제로 레이아웃을 구현하는 것은 이 클래스를 상속받은 여러 파생클래스들입니다. 이 파생클래스들은 각각 다른 방식으로 위젯들을 배치하는 알고리즘을 구현하고 있어, 개발자는 필요에 따라 적합한 Sizer를 선택해 사용할 수 있습니다.

..

..

 

 

3) 주요 Sizer 파생 클래스

 

■ 주요 Sizer 파생클래스와 특징

주요 Sizer 파생클래스와 특징
클래스명 설명 특징 및 용도
wx.BoxSizer 가장 기본적이고 많이 쓰이는 Sizer. 위젯들을 수평(wx.HORIZONTAL) 또는 수직(wx.VERTICAL) 방향으로 배치 단순한 선형 배치에 적합하며, 버튼이나 텍스트박스 등 위젯을 한 줄 또는 한 열로 정렬할 때 사용
wx.GridSizer 격자(grid) 형태로 위젯들을 배치 모든 셀 크기가 동일하며, 행과 열 수를 지정해 균등한 격자 배치가 필요할 때 사용
wx.FlexGridSizer wx.GridSizer의 확장판으로, 행과 열의 크기를 유동적으로 조절 가능 특정 행이나 열의 크기를 다르게 하거나, 크기가 변할 수 있는 복잡한 격자 배치에 적합
wx.GridBagSizer 격자 기반이지만, 각 위젯의 위치와 크기를 세밀하게 지정 가능 복잡한 레이아웃에서 위젯을 격자 내 임의 위치에 배치하거나 여러 셀을 차지하도록 할 때 사용
wx.WrapSizer 가로 또는 세로 방향으로 위젯을 배치하되, 공간이 부족하면 다음 줄로 감싸서 배치 공간에 따라 자동으로 줄 바꿈이 필요한 경우에 유용
wx.StaticBoxSizer wx.StaticBox 컨트롤과 함께 사용되는 Sizer로, 그룹 박스 내에 위젯들을 배치 시각적으로 그룹화된 위젯 묶음을 만들 때 사용

 

 

■ 각 파생클래스의 사용 예


1. wx.BoxSizer (수평 또는 수직 배치)
sizer = wx.BoxSizer(wx.VERTICAL)  # 수직 방향 배치
sizer.Add(button1, 0, wx.ALL, 5)
sizer.Add(button2, 0, wx.ALL, 5)

2. wx.GridSizer (격자 배치)
sizer = wx.GridSizer(rows=2, cols=2, gap=5)
sizer.Add(button1)
sizer.Add(button2)
sizer.Add(button3)
sizer.Add(button4)

3. wx.FlexGridSizer (유동적 격자)
sizer = wx.FlexGridSizer(rows=2, cols=2, vgap=5, hgap=5)
sizer.Add(button1)
sizer.Add(button2)
sizer.Add(button3)
sizer.Add(button4)
sizer.AddGrowableCol(1)  # 두 번째 열 크기 유동적 조절

4. wx.GridBagSizer (복잡한 격자 배치)
sizer = wx.GridBagSizer(vgap=5, hgap=5)
sizer.Add(button1, pos=(0,0))
sizer.Add(button2, pos=(0,1), span=(1,2))  # 두 칸 차지

5. wx.WrapSizer (자동 줄 바꿈)
sizer = wx.WrapSizer(wx.HORIZONTAL)
sizer.Add(button1)
sizer.Add(button2)
sizer.Add(button3)

 

 

■ 응용 연습 과제

1) 랜덤 컬러링

2) 좌우 균형 맞추기

 

 

5. Files

 

Not yet! ^.^;

 

 

6. Ref.

 

아름다운 세상,
즐거운 기초수학,
즐거운 프로그래밍,

Happy Programming!

^.^;



^.^;



'Programming > Python' 카테고리의 다른 글

PySide6 Intro. Ex. 001  (0) 2026.10.02
Syndia (v.0.0.3)  (0) 2026.09.15
wxPython 기본 위젯 - 003 - Panel, Sizer, Menu, Status Bar  (0) 2026.09.07
wxPython 기본 위젯 - 002 - Panel Container Widget  (0) 2026.09.06
Python Class - 001  (0) 2026.08.30