2017-12-31 183 views
1

이 코드는 두 개의 kivy 슬라이더를 표시하기위한 것입니다. 두 번째 슬라이더는 첫 번째 슬라이더와 함께 움직여야합니다 (반대가 아닙니다).kv 언어로 속성을 바인딩하는 방법은 무엇입니까?

import kivy 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.boxlayout import BoxLayout 

kivy.require('1.10.0') 

Builder.load_string (""" 
<Slider> 
    size_hint: 1, None 
    height: dp(40) 

<[email protected]>: 
    slider_1: slider_1 
    slider_2: slider_2 
    orientation: 'vertical' 

    Slider 
     id: slider_1 

    Slider 
     id: slider_2 
     value: slider_1.value 

<UI>: 
    orientation: 'vertical' 
    DoubleSlider:   
""") 


class UI(BoxLayout): 
    pass 


class MyApp(App): 
    def build(self): 
     return UI() 


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

이 (kvlang에서) 내가 찾은 유일한 솔루션입니다 : 내가 바인딩이 완료 클래스 DoubleSlider을했습니다. 그러나 나는 그것을 사용할 수 없다. 보이는 바인딩은 샘플 일 뿐이다.

실제로 숫자 속성 (특히 DoubleSlider 개체의 두 번째 슬라이더가 아닌)이있는 다른 다른 개체에서 첫 번째 슬라이더의 위치를 ​​사용할 수 있기를 원합니다. 즉, 대소 문자 구분을 할 것입니다. <UI> 규칙에 있습니다. 그래서 라인 value: slider_1.value을 제거하고이 같은 <UI> 규칙을 수정하려고 :

<UI>: 
    DoubleSlider: 
     # Is expected to be equivalent, but doesn't work 
     slider_2.value: slider_1.value 

나는 또한 아무 소용 getter('value')setter('value')를 사용하려고했습니다합니다.

질문 : 나는 대입의 관점에서 <UI>에서 무엇을하고 무엇을

  • ?

  • <UI>에서 슬라이더를 결합하는 적절한 방법은 무엇입니까 (slider_2 자체가 속성이 아닌 일반 참조이기 때문에, 나는 아무것도 결합하지 두려워하지만, 난 그냥 대신 slider_2 속성을 재 할당하고있어)? 당신이 인스턴스화하는 동안 바인딩을 수정하려면 그것이 최선의 선택인지는 모르겠지만, 사용자 정의 속성을 사용할 수 있습니다,

+0

코드가 잘 보이고 예상되는 효과가 있습니다 (slider_1을 변경하면 slider_2도 변경되지만 반대의 경우도 마찬가지입니다). – inclement

+0

@inclement : 코드는 작동하지만 인스턴스 수준에서 바인딩을 수행하는 것에 대한 제 제약 조건을 충족하지 않으며 그에 따라 편집하면 더 이상 작동하지 않습니다. – mins

+0

인스턴스 수준에서 바인딩을 수행하면 무슨 뜻인지 알 수 없습니다. 그게 내가 네가 실제로 한 일이야. – inclement

답변

1

(이것이 불가능하지 않는 것이 바람직 만 KV를 사용하여 lang을 사용하여). 이것은 또한 당신이 원하는 경우에 바인딩을 해제 할 수 있습니다 :

import kivy 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.boxlayout import BoxLayout 

kivy.require('1.10.0') 

Builder.load_string (""" 
<Slider> 
    size_hint: 1, None 
    height: dp(40) 

<[email protected]>: 
    tied: False     # <<<<<<<<<< 
    slider_1: slider_1 
    slider_2: slider_2 
    orientation: 'vertical' 

    Slider 
     id: slider_1 

    Slider 
     id: slider_2 
     value: slider_1.value if root.tied else self.value 


<UI>: 
    orientation: 'vertical' 
    BoxLayout: 
     Label: 
      text: "Tied" 
     CheckBox: 
      on_active: ds.tied = not ds.tied 

    DoubleSlider:  
     id: ds 
""") 


class UI(BoxLayout): 
    pass 


class MyApp(App): 
    def build(self): 
     return UI() 


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

enter image description here


편집 : 또 다른 옵션은 슬라이더의 value 부동산과 관련된 새로운 속성을 만드는 것입니다

import kivy 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.boxlayout import BoxLayout 

kivy.require('1.10.0') 

Builder.load_string (""" 
<Slider> 
    size_hint: 1, None 
    height: dp(40) 

<[email protected]>: 
    slider_1: slider_1 
    slider_2: slider_2 
    value1: slider_1.value 
    value2: slider_2.value 
    orientation: 'vertical' 

    Slider 
     id: slider_1 

    Slider 
     id: slider_2 



<UI>: 
    orientation: 'vertical' 

    DoubleSlider: 
     on_value1: self.slider_2.value = self.value1 

""") 


class UI(BoxLayout): 
    pass 


class MyApp(App): 
    def build(self): 
     return UI() 


if __name__ == '__main__': 
    MyApp().run() 
구문을 사용하십시오.
+0

@mins 나는 내가 이해했다고 생각한다. .. 나는 나의 판을 보았던 또 다른 생각을 가지고있다. – FJSevilla

+0

예, 가능한 해결책입니다. 파이썬'slider_1.bind (value = slider_2.setter ('value'))'(작동)의 엄격한 kvlang에 해당하는 것이 었는지 궁금합니다. 하지만 아마도 당신이 제안하는 것은 가장 가까운 것입니다 (또는 *이 * 동등한 것입니다). – mins

1

먼저 내가 제대로 올바르게 바인딩했던

을 수행 바인딩 모르겠어요. kvlang을 사용하면 멋있을 것입니다. 선언 스타일로 속성을 바인딩 할 수 있습니다.

KV 파일에 바인딩 :

value: slider_1.value 

과 같은 일을 순수 파이썬 :

slider_1.bind(value=slider_2.setter('value')) 

그래서 난 단지 인스턴스 수준에서 속성을 결합해야합니다.

당신은 실제로 인스턴스 수준에서 일을 결합하고 있습니다 : kvlang에 <[email protected]> 내부 Slider 속성을 설정은 - 파이썬에서 DoubleSlider 인스턴스의 생성자 내에서 슬라이더 값을 바인딩과 동일한 것입니다.

다른 DoubleSlider 인스턴스에 대한 조건에 따라 다른 바인딩이 필요한 경우 파이썬을 사용해야합니다.

+0

확인해 주셔서 감사합니다. +1, 나는 내 질문을 명확히했다. – mins