2016-09-20 2 views
1

부모 스피너에서 선택한 텍스트에 따라 Kivy Spinner의 값을 설정하는 방법을 찾고 있습니다. 문제는 두 스피너를 kv 언어로 정의했기 때문입니다. 접근법이 새로운 값이 처음부터 선택 될 때마다 두 번째 스피너를 파괴 한 다음, 다시 생성 할 것인지 (kv 코드로 인해 그렇게 할 수 없다면) 또는 if 목록을 업데이트하는 on_text 프로 시저를 기반으로 두 번째 스피너의 "값"을 동적으로 업데이트하는 방법이 있습니다.Kivy Spinner 값을 동적으로 변경하기

모든 경우에 아래 코드는 작동하지 않습니다. 어떤 도움을 주셔서 감사합니다. 감사.

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.spinner import Spinner 

Builder.load_string(''' 
<MainScreen>: 
    AnchorLayout: 
     anchor_x: 'center' 
     anchor_y: 'top' 
     BoxLayout: 
      size_hint: 1, .9 
      orientation: 'vertical' 
      padding: 80 
      spacing: 20 
      Spinner: 
       id: spinner_1 
       text: '<Select>' 
       values: root.pickType 
       on_text: root.updateSubSpinner(spinner_1.text) 
      Spinner: 
       id: spinner_2 
       text: '<Select>' 
       values: root.pickSubType 

    AnchorLayout: 
     anchor_x: 'center' 
     anchor_y: 'bottom' 
     size_hint: 1, .1 
     Button: 
      on_press: root.onExit() 
      text: 'Exit' 
      font_size: 50 

''') 

class MainScreen(FloatLayout): 
    def __init__(self, **kwargs): 
     self.buildLists() 
     super(MainScreen, self).__init__(**kwargs) 

    def buildLists(self): 
     self.pickType = ['Select','#1','#2','#3'] 
     self.pickSubType = ['Select'] 

    def updateSubSpinner(self,text): 
     if text == '#1': 
      self.pickSubType.extend('A'+'B') 
     elif text == '#2': 
      self.pickSubType.extend('P'+'Q') 
     else: 
      self.pickSubType.extend('Y'+'Z') 

    def onExit(self): 
     App.get_running_app().stop() 

class TestApp(App): 
    def build(self): 
     return MainScreen() 

if __name__ == "__main__": 
    TestApp().run() 

답변

1

당신은 심지어 바인딩되지 아니라 pickSubType 목록, 아이 스피너 값 목록을 참조해야합니다. 예 :

def updateSubSpinner(self, text): 
    self.ids.spinner_2.text = 'Select' 

    if text == '#1': 
     self.ids.spinner_2.values = ['A', 'B'] 
    elif text == '#2': 
     self.ids.spinner_2.values = ['P', 'Q'] 
    else: 
     self.ids.spinner_2.values = ['Y', 'Z'] 

첫 번째는 ListProperty되지 않은 경우, valuespickSubType를 결합하지 않는 values: root.pickSubType 작성. 원하는 경우 ListProperty으로 업그레이드 할 수 있지만 필요하지는 않습니다.

+0

고마워요. 그리스트가 스피너에 묶여 있다고 생각했는데, 스피너의 초기 값만을 제공하는 것처럼 보였으므로, 결국 잘못된 오브젝트로 작업하고있었습니다. 도움을 다시 주셔서 감사합니다. –

관련 문제