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

如何在Kivy中用单个类和方法实现多个下拉菜单?

用单个Python类实现Kivy多下拉菜单功能

问题分析

你当前的代码存在两个核心问题:

  1. KV文件中自定义下拉菜单的类名拼写错误(Python中是CustomDropDown,KV里写成了CustomDropdown),导致下拉菜单无法正确加载内容;
  2. 重复创建CustomDropDown子类和show_dropDown方法,造成代码冗余。

解决方案

我们可以通过给单个CustomDropDown类添加可配置属性,并让ButtonGrid通过属性传递参数的方式,实现用单个类管理多个不同样式的下拉菜单。

修改后的代码

main.py

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import Screen
from kivy.properties import StringProperty, ListProperty

Window.size = (286.110236, 570.33070866)


class HomeScreen(Screen):
    pass


class CustomDropDown(DropDown):
    # 定义可配置属性:下拉菜单文本、背景色
    dropdown_text = StringProperty('默认文本')
    dropdown_color = ListProperty((1, 1, 1, 1))


class ButtonGrid(ButtonBehavior, GridLayout):
    # 给按钮绑定对应的下拉菜单配置属性
    dropdown_text = StringProperty('')
    dropdown_color = ListProperty((1, 1, 1, 1))

    def show_dropDown(self):
        # 创建单个下拉菜单实例,传入当前按钮的配置
        dropdown = CustomDropDown(
            dropdown_text=self.dropdown_text,
            dropdown_color=self.dropdown_color
        )
        dropdown.open(self)


GUI = Builder.load_file("main.kv")

class MainApp(App):
    def build(self):
        return GUI


MainApp().run()

main.kv

#:import utils kivy.utils
<CustomDropDown>:
    Label:
        text: root.dropdown_text
        size_hint_y: None
        height: 400
        background_color: root.dropdown_color
        canvas.before:
            Color:
                rgba: self.background_color
            Rectangle:
                size: self.size
                pos: self.pos

<ButtonGrid>:
<HomeScreen>:
    FloatLayout:
        canvas:
            Color:
                rgb: utils.get_color_from_hex("#FFFFFF")
            Rectangle:
                size: self.size
                pos:  self.pos
        GridLayout:
            rows: 8
            cols: 1
            spacing: 10
            size_hint_y: None
            height: 1200
            width: self.minimum_width

            ButtonGrid:
                id: button1
                cols:1
                rows:1
                size_hint: 1, None
                height: 185.71
                # 设置下拉菜单的文本和颜色
                dropdown_text: 'Dropdown 1'
                dropdown_color: (0, 1, 0, .9)
                on_press: self.show_dropDown()
                background_color: (1,0,0,1)
                canvas.before:
                    Color:
                        rgba: self.background_color
                    Rectangle:
                        size: self.size
                        pos: self.pos
                Label:
                    text: "Button 1"

            ButtonGrid:
                id: button2
                cols:1
                rows:1
                size_hint: 1, None
                height: 185.71
                # 设置下拉菜单的文本和颜色
                dropdown_text: 'Dropdown 2'
                dropdown_color: (1, 0, 1, .9)
                on_press: self.show_dropDown()
                background_color: (0,0,1,1)
                canvas.before:
                    Color:
                        rgba: self.background_color
                    Rectangle:
                        size: self.size
                        pos: self.pos
                Label:
                    text: "Button 2"

关键改进点

  1. 修正类名拼写:KV文件中<CustomDropDown>与Python类名保持一致,确保下拉菜单内容能正确加载;
  2. 添加可配置属性:通过StringProperty和ListProperty让CustomDropDown支持自定义文本和背景色;
  3. 复用单个方法:ButtonGrid只保留一个show_dropDown方法,根据自身的dropdown_text和dropdown_color属性创建对应的下拉菜单;
  4. 简化代码结构:删除冗余的CustomDropDown2类和show_dropDown2方法,减少重复代码。

内容的提问来源于stack exchange,提问作者RandomCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:10:23