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

如何在Kivy的on_press事件中获取按钮及其属性值

解决Kivy按钮回调中获取按钮属性的问题

方法1:通过回调的event参数直接访问按钮属性

Kivy按钮的回调函数里,event参数就是触发事件的按钮实例本身,你可以直接通过它获取按钮的text属性,进而从数据库中查询对应的目录:

修改你的callback函数:

def callback(self, event):
    # 获取被点击按钮的文本
    button_text = event.text
    print(f"被点击的按钮是: {button_text}")
    # 这里根据button_text从数据库查询对应的目录
    # 示例:dir_path = your_database.get(button_text)
    # 后续执行打开目录操作,比如Windows用os.startfile(dir_path),Mac用subprocess.run(['open', dir_path])

方法2:使用functools.partial传递额外参数

如果需要直接传递目录路径(无需通过按钮文本查数据库),可以用functools.partial包装回调函数:

先导入partial:

from functools import partial

创建按钮时传入目录参数:

# 模拟数据库中的目录映射
book_dirs = {
    "Black Clover": "./books/black_clover",
    "Kaguya Sama": "./books/kaguya_sama",
    "Wandering Witch": "./books/wandering_witch",
    "B4": "./books/b4"
}

btn1 = Button(text="Black Clover",
              font_size=20,
              size_hint=(.5, .5),
              background_normal='images/Black_Clover,_volume_1.jpg',
              background_down='images/Black_Clover,_volume_1.jpg',
              on_press=partial(self.callback, dir_path=book_dirs["Black Clover"])
              )

修改回调函数接收参数:

def callback(self, dir_path, event):
    print(f"要打开的目录: {dir_path}")
    # 执行打开目录操作

方法3:自定义Button类添加专属属性

如果需要给按钮绑定更多自定义数据,可以继承Kivy的Button类,添加自定义属性:

from kivy.uix.button import Button

class BookButton(Button):
    def __init__(self, book_dir, **kwargs):
        super().__init__(**kwargs)
        self.book_dir = book_dir

创建按钮时传入目录:

btn1 = BookButton(text="Black Clover",
                  book_dir="./books/black_clover",
                  font_size=20,
                  size_hint=(.5, .5),
                  background_normal='images/Black_Clover,_volume_1.jpg',
                  background_down='images/Black_Clover,_volume_1.jpg',
                  on_press=self.callback
                  )

回调函数中直接访问属性:

def callback(self, event):
    print(f"要打开的目录: {event.book_dir}")

修改后的完整代码(方法1示例)

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.stacklayout import StackLayout
from kivy.uix.button import Button
from kivy.uix.widget import Widget
import os
import platform

class ReaderApp(App):
    def build(self):
        mainscreen = BoxLayout(orientation='horizontal')

        # Side Navbar
        navbar = BoxLayout(orientation='vertical')
        lib_btn = Button(text="Library", size_hint=(1, .2))
        settings_btn = Button(text="Settings", size_hint=(1, .2))
        about_btn = Button(text="About", size_hint=(1, .2))
        navbar.add_widget(lib_btn)
        navbar.add_widget(settings_btn)
        navbar.add_widget(about_btn)

        # Main Layout
        library = StackLayout(orientation='lr-tb')
        # 模拟数据库目录映射
        self.book_dirs = {
            "Black Clover": "./books/black_clover",
            "Kaguya Sama": "./books/kaguya_sama",
            "Wandering Witch": "./books/wandering_witch",
            "B4": "./books/b4"
        }

        btn1 = Button(text="Black Clover",
                      font_size=20,
                      size_hint=(.5, .5),
                      background_normal='images/Black_Clover,_volume_1.jpg',
                      background_down='images/Black_Clover,_volume_1.jpg',
                      on_press=self.callback
                      )
        btn2 = Button(text="Kaguya Sama",
                      font_size=20,
                      size_hint=(.5, .5),
                      background_normal='images/Kaguya-sama_Love_is_War_art.jpg',
                      background_down='images/Kaguya-sama_Love_is_War_art.jpg',
                      on_press=self.callback
                      )
        btn3 = Button(text="Wandering Witch",
                      font_size=20,
                      size_hint=(.5, .5),
                      background_normal='images/Majonotabitabi.jpeg',
                      background_down='images/Majonotabitabi.jpeg',
                      on_press=self.callback
                      )
        btn4 = Button(text="B4",
                      font_size=20,
                      size_hint=(.5, .5),
                      on_press=self.callback
                      )
        library.add_widget(btn1)
        library.add_widget(btn2)
        library.add_widget(btn3)
        library.add_widget(btn4)

        mainscreen.add_widget(navbar)
        mainscreen.add_widget(library)

        return mainscreen

    def callback(self, event):
        button_text = event.text
        print(f"被点击的书籍: {button_text}")
        dir_path = self.book_dirs.get(button_text)
        if dir_path:
            print(f"打开目录: {dir_path}")
            # 根据系统打开目录
            if platform.system() == "Windows":
                os.startfile(dir_path)
            elif platform.system() == "Darwin":
                os.system(f"open {dir_path}")
            else:
                os.system(f"xdg-open {dir_path}")
        else:
            print(f"未找到书籍 {button_text} 的目录")

if __name__ == '__main__':
    ReaderApp().run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:15:44