动态更改Kivy Spinner的值

4
我正在寻找一种方法,根据父 Spinner 中选择的文本来设置 Kivy Spinner 的值。问题在于我已经在 kv 语言中定义了这两个 Spinner。我不确定是否应该在每次从第一个 Spinner 中选择新值时销毁第二个 Spinner,然后重新生成它(如果是这样,由于 kv 代码的原因,我不知道如何做),还是有一种方法可以根据更新列表的 on_text 过程动态更新第二个 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个回答

4

您应该引用子级Spinner值列表,而不是未绑定它的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,但这并非必要。


非常感谢。我以为列表与旋转器绑定,尽管它显然只提供旋转器其初始值,所以最终我在错误的对象上工作。再次感谢您的帮助。 - Omar Little

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接