动态更改 Kivy Spinner 值
Changing Kivy Spinner values dynamically
我正在寻找一种方法来根据从父微调器中选择的文本设置 Kivy 微调器的值。问题是我已经用 kv 语言定义了两个微调器。我不确定这种方法是否会在每次从第一个微调器中选择一个新值时销毁第二个微调器,然后重新生成它(如果是这样,由于 kv 代码,我不知道该怎么做),或者如果将有一种方法可以根据更新列表的 on_text 过程动态更新第二个微调器的 "values"。
在所有情况下,以下代码均无效。任何帮助表示赞赏。谢谢
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()
您应该引用子微调器值列表,而不是 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
,但这不是必需的。
我正在寻找一种方法来根据从父微调器中选择的文本设置 Kivy 微调器的值。问题是我已经用 kv 语言定义了两个微调器。我不确定这种方法是否会在每次从第一个微调器中选择一个新值时销毁第二个微调器,然后重新生成它(如果是这样,由于 kv 代码,我不知道该怎么做),或者如果将有一种方法可以根据更新列表的 on_text 过程动态更新第二个微调器的 "values"。
在所有情况下,以下代码均无效。任何帮助表示赞赏。谢谢
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()
您应该引用子微调器值列表,而不是 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
,但这不是必需的。