Kivy는 멀티터치 앱처럼 혁신적인 사용자 인터페이스를 갖춘 애플리케이션을 빠르게 개발할 수 있도록 도와주는 오픈소스 Python 라이브러리입니다. 안드로이드 앱은 물론 데스크톱 애플리케이션 개발에도 널리 활용됩니다. 이 글에서는 FloatLayout 위젯을 사용해 창(window) 안의 다양한 위치에 버튼을 배치하는 방법을 알아봅니다. 버튼의 위치는 부모 창을 기준으로 절대 좌표 또는 상대 좌표로 지정할 수 있습니다.
1. 절대 위치(Absolute Position)로 배치하기
이 방식은 버튼의 위치를 고정된 좌표로 설정합니다. 창 크기를 조절하면 창과 버튼 자체의 크기는 함께 변하지만, 버튼의 위치는 항상 동일하게 유지됩니다. 따라서 창을 계속 줄이면 버튼이 화면 밖으로 밀려나 결국 보이지 않게 될 수 있습니다.
예제 코드
import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
#from kivy.config import Config
#Config.set('graphics', 'resizable', True)
# App 클래스 생성
class FloatApp(App):
def build(self):
# FloatLayout 생성
Flt = FloatLayout()
btn = Button(text='Hello world',
size_hint=(0.5, 0.2),
pos=(100, 200),
background_normal='',
background_color=(1, 0, 1, 1))
# 버튼 위젯 추가
Flt.add_widget(btn)
return Flt
# 앱 실행
FloatApp().run()위 코드를 실행하면 아래와 같은 결과를 확인할 수 있습니다.

2. 상대 위치(Relative Position)로 배치하기
이 방식은 pos_hint(위치 힌트)를 사용해 버튼의 위치를 지정합니다. 창 크기가 조절되면 창과 버튼의 크기가 변할 뿐만 아니라, 버튼의 위치 역시 창의 상대적인 크기에 맞춰 자동으로 재계산됩니다. 덕분에 창을 아무리 줄여도 버튼이 화면에서 사라지지 않습니다.
예제 코드
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.config import Config
Config.set('graphics', 'resizable', True)
# App 클래스 생성
class FloatApp(App):
def build(self):
# FloatLayout 생성
Flt = FloatLayout()
btn = Button(text='Hello world',
size_hint=(0.2, 0.2),
pos_hint={'x': .2, 'y': .2},
background_normal='',
background_color=(1, 1, 0, 0.8)
)
# 버튼 위젯 추가
Flt.add_widget(btn)
return Flt
# 앱 실행
FloatApp().run()실행 결과
위 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.

정리
FloatLayout에서 pos를 사용하면 고정된 절대 좌표에 위젯을 배치할 수 있고, pos_hint를 사용하면 창 크기에 비례하는 상대 좌표로 배치할 수 있습니다. 반응형 UI를 만들고 싶다면 pos_hint 방식이 훨씬 유연하고 안정적이므로 대부분의 경우 권장됩니다.