2016-09-20 5 views
1

Я ищу способ установить значения Kivy Spinner в зависимости от текста, выбранного из родительского счетчика. Проблема в том, что я определил оба прядильника на языке kv. Я не уверен, что подход будет заключаться в том, чтобы уничтожить второй счетчик каждый раз, когда новое значение выбирается из первого, а затем регенерировать его (если это так, я не знаю, как это сделать из-за кода kv), или если был бы способ динамически обновлять «значения» второго счетчика на основе процедуры on_text, обновляющей список.Динамическое изменение значений кивков Kivy

Во всех случаях приведенный ниже код не работает. Любая помощь оценивается. Благодарю.

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'] 

Запись values: root.pickSubType не связывает pickSubType к values, если первый не ListProperty. Вы можете обновить его до ListProperty, если хотите, но это не обязательно.

+0

Большое спасибо. Я думал, что список был привязан к счетчику, хотя явно кажется, что он обеспечивает только начальные значения счетчика, поэтому в конце концов я работал над неправильным объектом. Спасибо за помощь снова. –

Смежные вопросы