You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:45:59