2014-10-17 3 views
2

저는 Kivy를 처음 사용하고 있으며 위젯에 대해 몇 가지 질문이 있습니다. 나는 Kivy를 몇 달 전에 망쳐 버리기 시작했다. 나는 약간의 문서를 읽었지만 나는 많은 것들을 놓쳤을지도 모른다.Kivy가 위젯의 새 인스턴스를 만듭니다.

고유 한 속성을 사용하여 동일한 위젯 클래스의 인스턴스를 여러 개 만들 수 있습니까?

제 목표는 크기를 조정하고 독립적으로 드래그 할 수있는 몇 개의 직사각형을 만드는 것입니다.

저는 Java 클래스를 사용하기 때문에 클래스에서 배운 내용과 비교해 보겠습니다. 예를 들어, 기본 rect.java 클래스에서 폭과 높이의 두 변수를 사용하도록 설정했다고 가정 해 보겠습니다.

그래서 내 주 된 .java 코드 파일에서 나는 사각형 클래스의 몇 가지 인스턴스를 생성하기 위해 다음처럼 작성할 수 있습니다 :

rect s1 = new rect(2,3); // width & height 
rect s2 = new rect(5,4); 

그런 다음 s1.height 및 s2.height는 다른 값을 가질 것이다.

Kivy에서 비슷한 것을 달성 할 수 있습니까? 그것은 크기 조정 및 주변 드래그 할 수 있도록 내 평 파일에 코드를 작성했습니다

<rect1>: 

    canvas: 
     Color: 
      rgba: 1, 0, 1, 0.5 
     Rectangle: 
      pos: root.center_x - root.width/2,root.center_y - root.height/2 
      size: self.size 
<rect2>: 

    canvas: 
     Color: 
      rgba: 1, 1, 0, 0.5 
     Rectangle: 
      pos: root.center_x - root.width/2,root.center_y - root.height/2 
      size: self.size 

<rect3>: 

    canvas: 
     Color: 
      rgba: 0, 1, 0, 0.5 
     Rectangle: 
      pos: root.center_x - root.width/2,root.center_y - root.height/2 
      size: self.size 

: 지금 내 .kv 파일에서 설정 한 속성이 같은 많은 클래스가 있습니다. 지금은 각 추가 클래스를 사용하기 위해 코드를 복사/수정했습니다.

내가 사용하는 지금은, 경우 :

Window.add_widget(rect1) 

그것은 바로 하나 이상 상단에 새 인스턴스를 만들 것입니다하지만 난 내 마우스로 드래그하면 그들은 여전히 ​​등 같은 좌표 및 기타 속성을 공유하고, 그 클래스의 모든 인스턴스는 같은 좌표를 따릅니다. 다시 한 번, 제 목표는 크기를 조정하고 독립적으로 드래그 할 수있는 여러 사각형을 만드는 것입니다.

답변

1

Window에는 하나의 위젯 (응용 프로그램 루트 위젯) 만 있어야합니다. 루트 위젯 인스턴스를 App.build()에서 반환하거나 앱의 kv 파일에 루트 위젯을 포함하여이 위젯을 자동으로 추가하는 것이 가장 좋습니다.

이 경우 FloatLayout이 가장 적합합니다.

또한 Scatter 위젯을 사용하여 이동 (번역), 크기 조정 및 회전과 같은 변환을 처리 할 수 ​​있습니다. 직접 수행하는 것보다 쉽습니다. Scatter에있는 각 위젯을 감싸거나 위젯을 Scatter까지 확장하십시오.

1

꺾쇠 괄호 (<, >)로 정의하는 각 항목은 인스턴스가 아닌 클래스 선언입니다. Kv 파일에서 다른 속성으로 클래스를 인스턴스화하려면 꺾쇠 괄호없이 이름을 사용하십시오.(당신이 그것을 나열하지 않았기 때문에 사용자의 운동 기능이없는) 여기

<MovableRect>: 
    size: 50, 50 
    canvas: 
     Color: 
      rgba: root.color 
     Rectangle: 
      size: self.size 
      pos: self.pos 

<[email protected]>: 
    MovableRect: 
     id: rect1 
     color: 1, 0, 1, 0.5 
     pos: 5, 5 

    MovableRect: 
     id: rect2 
     color: 1, 1, 0, 0.5 
     pos: 130, 130 

    MovableRect: 
     id: rect3 
     color: 0, 1, 0, 0.5 
     pos: 250, 250  

# instantiation of root widget 
MyRoot: 

는 파이썬 파일입니다 : 경우 a

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.screenmanager import ScreenManager 
from kivy.properties import ListProperty 

class MovableRect(Widget): 
    color = ListProperty([1, 0, 1, 0.5]) 

class Test1App(App): 
    def build(self): 
     pass 

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

여기

는 사용자가 제공 한 코드 조각에 따라 약간의 작업 코드입니다 youtube에 우수한 kivy 충돌 과정 시리즈를 참조 할 수있는 더 완전한 예. 한 가지 예는 사용자가하려는 것과 매우 유사합니다. https://www.youtube.com/watch?v=ChmfVOu9aIc

관련 문제