如何获取Kivy下拉菜单的用户选中值并用于程序?
在Kivy中获取下拉菜单选中值的方法
问题描述
我在Kivy中创建了一个下拉菜单,希望获取用户选中的值以便在后续程序中使用。以下是我的代码:
KV代码
BoxLayout: orientation: 'horizontal' size_hint_x: 1 Button: pos_hint:{'center_x': .5, 'center_y': .5} id: units_num_btn text: '0' size_hint_y: None height: 44 on_parent: drop_player_numbers_units.dismiss() on_release: drop_player_numbers_units.open(self) DropDown: id: drop_player_numbers_units on_select: units_num_btn.text = '{}'.format(args[1]) on_select: app.return_player_numbers() Button: id: units_num_btn_1 text: '1' size_hint_y: None height: 35 on_release: drop_player_numbers_units.select('1') Button: id: units_num_btn_2 text: '2' size_hint_y: None height: 35 on_release: drop_player_numbers_units.select('2')
Python代码
class drop_content(DropDown): pass class PlayerScreen(Screen): pass class TheApp(App): def build(self): sm = ScreenManager() sm.add_widget(PlayerScreen(name='player_setup')) sm.current = 'player_setup' return sm def main(): Builder.load_file('menu.kv') app = TheApp() app.run() if __name__ == '__main__': main()
我之前通过如下方式获取TextInput的文本值,但该方法不适用于下拉菜单:
Python示例
def return_text(self): text = self.root.get_screen('screen').ids.specific_id.text print(text)
KV示例
TextInput: id: input text: "2" on_text: app.return_text()
请问该如何实现获取下拉菜单选中值的功能?
解决方案
方法1:直接在on_select事件中传递选中值
可以在KV的on_select事件里直接把选中的值传给App的方法,无需额外通过按钮文本中转:
修改KV代码中的DropDown部分:
DropDown: id: drop_player_numbers_units on_select: units_num_btn.text = '{}'.format(args[1]) app.return_player_numbers(args[1]) # 直接传递选中值
然后在Python的TheApp类中实现对应方法:
class TheApp(App): def build(self): sm = ScreenManager() sm.add_widget(PlayerScreen(name='player_setup')) sm.current = 'player_setup' return sm def return_player_numbers(self, selected_value): # 直接拿到选中的值,可保存或用于后续逻辑 print("选中的值是:", selected_value) # 可将值存在App属性中,方便其他模块调用 self.selected_units = selected_value
方法2:通过按钮ID获取文本(复用TextInput思路)
因为你已经把选中值同步到了按钮units_num_btn的文本里,所以可以沿用之前通过ID取值的逻辑:
修改TheApp类中的return_player_numbers方法:
class TheApp(App): def build(self): sm = ScreenManager() sm.add_widget(PlayerScreen(name='player_setup')) sm.current = 'player_setup' return sm def return_player_numbers(self): # 获取对应屏幕内按钮的文本,即为选中值 selected_value = self.root.get_screen('player_setup').ids.units_num_btn.text print("选中的值是:", selected_value)
注意:确保units_num_btn的ID处于PlayerScreen的布局范围内,否则无法通过该方式获取。
方法3:在Screen类中存储选中值
可以将选中值存在PlayerScreen的属性中,方便在屏幕内部或其他模块调用:
先修改KV代码:
DropDown: id: drop_player_numbers_units on_select: units_num_btn.text = '{}'.format(args[1]) root.selected_units = args[1] # 将值存入Screen的属性 app.return_player_numbers()
然后修改PlayerScreen类,添加属性:
from kivy.properties import StringProperty class PlayerScreen(Screen): selected_units = StringProperty('0') # 初始化默认值为0
之后在App的方法中即可获取该值:
def return_player_numbers(self): selected_value = self.root.get_screen('player_setup').selected_units print("选中的值是:", selected_value)
内容的提问来源于stack exchange,提问作者Max Davies
相关产品推荐
相关产品推荐

