ScreenManager
ScreenManager는 여러 device에서 screen을 적절하게 조절할 수 있게 해준다.
multiple screen을 갖도록 해주며 screen간 switch를 쉽게 해준다.
ScreenManager는 항상 Screen widget을 가져아하고, 다른 Widget을 가질 수 없다.
Screen으로 사용되는 곳에도 명시가 필요하다. @Screen으로 상속해주어야 한다.
Screen은 manager attribute를 갖고, 이를 통해 접근할 수 있다.
name property를 Screen에 명시하여 screen을 변경할 수 있다.
- 예를 들어
root.current = 'comicscreen'을 통해 comicscreen으로 switch 함.- 여기서
root는 ScreenManager 이고,current는 active screen 임.
- 여기서
- 유사하게
current = 'colorscreen'으로 colorscreen으로 switch 할 수 있음.comiccreator.kv에서 각 항목들에 대해 id, root를 부여하는 이유
ScreenManager를 사용하게 되면 ScreenManager가 Screen들을 통제하게 되는 구조가 되기 때문에 .py에서 kivyApp이 빌드하는 최상위가 Manager가 되야 한다.
Color
동적으로 coloring 하기 위한 방법이다.
canvas.add와 with ---.canvas:를 통해 color를 추가할 수 있다.
canvas.add(Color(1,0,0,1))
with canvas:
Color(1,0,0,1)
canvas.before.add를 사용하면 Color instruction이 Canvas에 추가한 다른 instructions보다 먼저 적용되도록 할 수 있다.
transision
screen을 switch 할 때 어떤 animation이 보이는가에 대한 것이다.
etc
load_file은 .kv를 include하는 것이며, 이와 유사하게 load_string으로 .kv를 python file에서 사용할 수 있다.
stencilView
특정 영역에만 이벤트를 처리하기 위해서 collide_points와 같은 방법을 사용했었는데, 이건 group mode나 resize 같은 상황에서 완벽하지 않다.
따라서 StencilView를 쓰는데, StencilView는 drawing area를 해당 view의 공간까지로 제한하며, 밖에 그려진 것들은 숨겨진다.
drawingspace를 제한하기 위해StencilView를 상속하도록 함.DrawingSpace(RelativeLayout)을DrawingSpace(stencilView)로 변경.- 참 여기서 DrawingSpace는 예제에서 만들어낸 클래스!
StencilView는 RelativeLayout이 아니므로, StencilView class는 relative coordinates를 사용할 수 없다. 즉, 여기서 사용한다면 상위의 RelativeLayout을 사용하게 되는 것이며, 일반적으로 drawing은 relative coordinates를 사용하는 것이 좋으므로 RelativeLayout안에 DrawingSpace을 사용하도록 한다.
DrawingSpace(RelativeLayout)와 같은 동작을 원한다면 RelativeLayout을 가질 수 있도록 RelativeLayout으로 DrawingSpace를 감싸도록 한다. 이렇게 되면 RelativeLayout이 원하는 위치와 사이즈를 갖도록 설정해주어야 한다.RelativeLayout: DrawingSpace:
scatter
scale, rotate와 같은 기능들을 가지고 있는 class. 두 손가락으로 scale과 rotate를 할 수 있도록 구현되어 있고, mobile에서도 사용가능하다.
scatter도 RelativeLayout처럼 relative coordinates를 사용한다.
scatter 적용
- DraggableWidget이 Scatter를 상속하도록 함.
- scatter가 event를 받을 수 있도록
on_touch_down에super.on_touch_down를 추가 함. - scatter가
posproperty에 대한on_posmethod를 지원하므로on_touch_move대신 사용. - scatter는
rotation과scaleproperty를 또한 지원하며,on_rotation,on_scale사용.
property 활용
property의 활용은 하나의 변경이 다른 widget에 영향을 미칠 때 효과적으로 사용할 수 있다.
예를들어 하나의 widget이 rotation이 변경되면, on_rotation 함수가 호출되는데, 이 함수 내부에서 연관된 widget들의 rotation을 변경하여 on_rotation을 호출할 수 있다.
gesture
kivy 에서는 gesture를 저장할 수 있는데, gesture를 string으로 저장함.
on_touch_down, on_touch_move, on_touch_up 마다 point를 저장하여 string으로 변환하는 방식이다.
gesture = Gesture()로 Gesture를 생성하고gesture.add_stroke(self.points)로 points를 넣고self.points += [touch.pos]로 points가 기록되어 있음
gesture.normalize()로 default number로 바꾸고GestureDatabase.gesture_to_str(gesture)로 string으로 출력하여 확인하도록 함.
kivy 에서 저장한 gesture를 활용하는 방식.
str_to_gesture로 저장해둔 string gesture를 gesture로 바꿈GestureDataBase.add_gesture로 gesture를 database에 추가on_touch_down,on_touch_move,on_touch_up에 대한 함수 구현.- 각 함수에서
[touch.pos]를 저장하고,on_touch_up에서GestureDatabase.find를 통해 database에서 저장된 gesture가 있는지 찾도록 함.
- 각 함수에서
- 찾은 값과, database에 넣은 gesture가 일치하는지 확인하여 사용.
- 여기서는
discriminate를 통해 해당 그림들을 그리도록 하였음.
- 여기서는
behavior
특정 widget의 classic behavior를 다른 behavior에 사용할 수 있다.
예를 들어, ButtonBehavior(on_press, onRelease를 사용하기 위한)를 Label이나 Image widget에 사용할 수 있다.
behavior는 widget의 appearance를 바꾸는 것이 아니라, functionallity만 넣어주는 것이다.
multiple inheritance를 통해 사용할 수 있지만, touch가 중복되거나, 동일 property를 갖는 경우에 대해 조심해서 사용해야 한다.
현재는 아래의 Behavior만 사용할 수 있다.
- ButtonBehavior
- ToggleButtonBehavior
- DragBehavior
style
Window: window를 import 하여, 몇 가지 application window와 global parameter, event를 설정할 수 있다. clearcolor property 를 통해 backgrond color를 설정할 수 있다.
bold: bold property로 폰트 설정할 수 있다.
background_normal, background_down: background_normal과 background_down property를 통해, Button의 background image를 설정할 수 있다.
<Label>, <Button>과 같이 widget에 대한 적용을 하면 코드 전체의 Label에 영향을 미칠 수 있다.
- set할 때의 순서도 중요함. Button을 먼저 set하면, Label 것이 overwrite.
Factory
새로운 class를 등록할 수 있다. 말 그대로 정말 만들어내는 것.
Factory.register()으로, kivy에서 ‘name’으로 사용할 수 있는 class를 등록할 수 있다.
등록된 name은 .kv에서 사용 가능하다.
Factory.unregister()으로, 등록된 name을 해제할 수도 있다.
- Line을 unregister로 해제하고, register로 새로만든 Line을 등록함으로써 Line을 재정의하는 방식으로도 사용할 수 있다.
kwargsparameter가 Line의 모든 property를 가지고 있는데, 여기서kwargs['width']를 사용하여 Line의 두께를 바꿀 수 있음.