Category Archives: Kivy

[Python – Kivy] 2. ObjectProperty로 kv객체 바인딩 하기 & 이벤트 바인딩 하기.

델파이나 윈도우 프로그래밍을 하면 알겠지만 컴포넌트를 드래그앤드롭으로 배치한 다음에 필수적으로 하는 것이 바로 Id를 부여하는 것이다.

Id를 부여하게 되면 pas가 됐든, m이 됐든 c가 됐든 지간에 해당 id를 통해서 컴포넌트를 프로그래밍으로 컨트롤 할 수 있다.

이번에는 Kivy 의 아이디 개념인 ObjectProperty를 컴포넌트에 부여하고,

거기에 덧붙여 이벤트까지 부여하는 방식에 대해 알아본다.

main.py

from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
from kivy.uix.popup import Popup
from kivy.uix.label import Label


# 샘플 위젯 설정
class Sample(Widget):
    # 버튼을 Object property 로 가져옴. 해당 명칭은 kv 파일내에서 명시함
    p_btnTest = ObjectProperty(None)

    # 팝업 이벤트
    def change_text(self, instance):
        print(instance.title)
        self.p_btnTest.text = "closed."
        return False

    # 버튼 이벤트
    def show_instructions(self):
        # 해당 버튼의 텍스트와 컬러를 바꿈
        self.p_btnTest.text = "1"
        self.p_btnTest.background_color = (1.0, 0.0, 0.0, 1.0)

        # 팝업 설정
        msg = Popup(title='Test popup',
                    size_hint=(None, None),
                    size=(400, 400),
                    content=Label(text='Hello world'),
                    auto_dismiss=True)

        # 이벤트를 Python 파일내에서 바인딩함.
        msg.bind(on_dismiss=self.change_text)
        msg.open()


# 앱 설정 및 위젯 리턴
class SampleApp(App):
    def build(self):
        return Sample()


# 앱 시작
if __name__ == '__main__':
    SampleApp().run()

 

Sample.kv

# encoding: utf-8
#:kivy 1.0.9

<Sample>: # 위젯의 이름과 동일 해야함
    p_btnTest: btnTest # 설정된 kv 아이디를 python파일의 오브젝트와 바인딩 할 명칭을 명시함

    Label:
        font_size: 70
        center_x: root.width / 2
        top: root.top - 50
        text: "Kivy Sample App"

    Button:
        id: btnTest # 버튼의 아이디를 설정함 - 이 아이디는 kv 내에서만 유효함
        text: "Sample Button"
        center_x: root.width / 2
        center_y: root.height / 2
        width: 300
        on_press: root.show_instructions()

스크린샷 2016-04-26 12.45.53

앱 구동한 모습

스크린샷 2016-04-26 12.46.00

팝업 메뉴를 띄웠다.

스크린샷 2016-04-26 12.46.04

이벤트에 따라서 버튼의 색과 명칭이 바뀐 것을 볼 수 있다.

 

 

[Python – Kivy] 1. Kivy 아주 기초적인 Sample 앱 만들기

Kivy는 Python을 기반으로 Cross Platform GUI Program 을 만들 수 있게 도와주는 라이브러리다.

Python으로 별에 별 것을 다할 수 있다는 것에 새삼 감탄을 한다.

원래는 Electron 을 활용해서 만들려고 했지만, 요즘 한창 Python에 꽂혀있기 때문에, Python으로 할 수 있는 것을 찾아보았다.

그렇게 해서 찾은 것이 Kivy다.

 

하나씩 배워가면서 포스팅을 해야겠다.

 

Kivy 는 크게 두가지 파일로 이루어진다.

하나는 Python이고, 다른 하나는 .kv라고 하는, 화면 layout을 구성하는 부분이다.

 

.kv는 kivy 에서 자체 정의한 형식인데,  델파이의 dfm와 흡사한 기능을 한다.

Python과 마찬가지로 indent를 맞춰줘야 한다.

 

아래 코드를 보면 App과 Widget으로 구성되어 있는 것을 볼 수 있다.

App은 말그대로, 하나의 Application 을 의미하고, Widget은 그 하위 클래스다.

py에서 정의한 Sample에 대해서 kv는 그대로 그것을 정의 하고 있다. (Sample)

 

아주 간단한 예제라, 간단하게 코드만 봐도 쉽게 이해할 수 있을 것 같다.

 

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.popup import Popup
from kivy.uix.label import Label


class Sample(Widget):
    @staticmethod
    def show_instructions():
        msg = Popup(title='Test popup',
                    size_hint=(None, None),
                    size=(400, 400),
                    content=Label(text='Hello world'),
                    auto_dismiss=True)
        msg.open()


class SampleApp(App):
    def build(self):
        return Sample()


if __name__ == '__main__':
    SampleApp().run()

 

sample.kv

#:kivy 1.0.9

<Sample>:
    Label:
        font_size: 70
        center_x: root.width / 2
        top: root.top - 50
        text: "Kivy Sample App"

    Button:
        id: btnTest
        text: "Sample Button"
        center_x: root.width / 2
        center_y: root.height / 2
        width: 300
        on_press: root.show_instructions()

 

실행화면

스크린샷 2016-04-25 15.41.28

스크린샷 2016-04-25 15.43.24