2016-09-20 79 views
1

我正在寻找一种方法来设置Kivy Spinner的值,具体取决于从父Spinner中选择的文本。问题是我已经用kv语言定义了两个spinners。我不确定这种方法是否会在每次从第一个值中选择一个新值时销毁第二个微调器,然后重新生成它(如果是这样,我不知道该怎么做,因为kv代码),或者如果会有一种方法可以根据更新列表的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'] 

写入values: root.pickSubTypepickSubType不结合到values,如果第一不是ListProperty。如果你喜欢,你可以将它升级到ListProperty,但这不是必需的。

+0

非常感谢。我认为这份清单是与纺纱厂绑定的,尽管它似乎只是给纺纱厂提供了它的初始价值,所以我最终正在处理错误的物品。再次感谢您的帮助。 –