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가
pos
property에 대한on_pos
method를 지원하므로on_touch_move
대신 사용. - scatter는
rotation
과scale
property를 또한 지원하며,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을 재정의하는 방식으로도 사용할 수 있다.
kwargs
parameter가 Line의 모든 property를 가지고 있는데, 여기서kwargs['width']
를 사용하여 Line의 두께를 바꿀 수 있음.