필수
옵션
다운로드
pip와 setuptools를 최신 버젼으로 업데이트
python -m pip install --upgrade pip wheel setuptools
연계항목 설치
python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew python -m pip install kivy.deps.gstreamer --extra-index-url https://kivy.org/downloads/packages/simple/
kivy 설치
python -m pip install kivy
EventDispatcher : 이벤트를 등록하고 디스패치하는 중요 클래스
이벤트를 대응 되는 클래스는,
이벤트의 발생(실행은) MainLoop 가 관할한다.
# import from kivy.clock import Clock
Kivy 의 메인루프가 있다. 이벤트에 대응하는 콜백도 이 메인루프에서 호출된다. 지연 시간이 길거나 무한 루프를 넣어버리면 앱이 바보가 된다.
while True: animate_something() time.sleep(.10)
schedule_interval() 을 사용해서 초당 X번 호출되도록 함수 또는 메쏘드를 추가할 수 있다.
추가
def my_callback(dt): print('My callback is called: ', dt) event = Clock.schedule_interval(my_callback, 1/30)
캔슬
# 방법-1 event.cancel() # 방법-2 Clock.unschedule(event)
콜백함수에서 False를 리턴하면 자동 종료 된다.
schedule_once()는 콜백함수를 한번만 호출한다, 몇프레임 뒤 또는 몇초 후에.
def my_callback_once(dt): print('it called !') Clock.schedule_once(my_callback_once, 1) # 1초 후에 호출된다. (in one second)
대기시간 파라미터의 의미는
용도가 이해가 잘 안되는데? 아무튼.
# 일, 한번만 호출되도록 설정 event = Clock.schedule_once(my_callback, 0) # 그런데 다른 곳에서 이 콜백을 재설정 해야할 경우, # 기존 것을 삭제하고 다시 스케쥴을 추가한다. Clock.unschedule(event) event = Clock.schedule_once(my_callback, 0) # # 이렇게 쓰면 비용이 높답니다. #
schedule_once() 대신 필요한 시점에 호출 할 수 있는 이벤트로서 트리거를 사용하자.
trigger = Clock.create_trigger(my_callback) # call later trigger()
trigger()를 호출할 때마다 한번한 실행되도록 설정된다. 이미 실행하도록 추가되어 있다면 추가되지 않는다.
이벤트 종류 :
임의의 이벤트를 만들려면 (1) 이벤트 이름을 등록한다 (2) 이벤트 이름과 같은 메소드를 만든다. (3) 사용한다
from kivy.event import EventDispatcher class MyEventDispatcher(EventDispatcher): def __init__(self,**kwargs): self.register_event_type('on_test') super(MyEventDispatcher, self).__init__(**kwargs) def do_something(self,value): self.dispatch('on_test', value) def on_test(self, *args): print('i am dispatched', args)
바인딩Binding
def my_callback(value, *args): print('Hello, I got an event', args) ev = MyEventDispatcher() ev.bind(on_test=my_callback) ev.do_something('test')
Properties are an awesome way to define events and bind to them.
Essentially, they produce events such that when an attribute of your object changes, all properties that reference that attribute are automatically updated.
There are different kinds of properties to describe the type of data you want to handle.
이벤트에 필요한 데이터 타입을 프로퍼티라고 하는거 같다.
StringProperty / NumericProperty / BoundedNumericProperty / ObjectProperty / DictProperty
ListProperty / OptionProperty / AliasProperty / BooleanProperty / ReferenceListProperty
# # class MyWidget(Widget): text = StringProperty('') # # def __init__(self, **kwargs): super(MyWidget, self).__init__(**kwargs)
Kivy의 프로퍼티는 'on_<property_name>' 같은 이름의 이벤트로 제공된다.
이 이벤트는 프로퍼티의 값이 바뀔때 이벤트가 호출된다. 프로퍼티의 값이 전,후가 같은 경우 이벤트는 발생되지 않는다.
hmm..
class CustomBtn(Widget): pressed = ListProperty([0,0]) def on_touch_down(self, touch): if self.collide_point(*touch.pos): self.pressed = touch.pos return True return super(CustomBtn, self).on_touch_down(touch) def on_pressed(self, instance, pos): print('pressed at {pos}'.format(pos=pos))
?? 재정리
그려러니 하는 부분은 넘어가자.
root widget 에서 시작되고 자식 위젯을 가질 수 있고, 자식 위젯은 또 자식 위젯을 가질 수 있다. 이 형식은 tree 형태로 구성된다. 자식 위젯들(children)는 ListProperty 속성으로 저장된다.