首页 > 编程问答 >单独的类和文件中的按钮在 KivyMD 中不起作用

单独的类和文件中的按钮在 KivyMD 中不起作用

时间:2024-08-09 02:50:31浏览次数:7  
标签:python class kivy kivymd

我刚刚开始使用 Kivy,并且混合使用 Kivy 和 KivyMD。我制作了一个简单的按钮,位于单独的文件和类中,并将其添加到我的主类中。它应该只打印“WORKS”,但它没有

这是我的 main.py

from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from audio_player import AudioPlayer

class Demo(MDApp):
    def build(self):
        screen = MDScreen()
        player = AudioPlayer()

        btn = player.playerBTN()
        screen.add_widget(btn)
        return screen
    

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

这是位于 audio_player.py

from kivymd.uix.button import MDRectangleFlatButton
from kivy.core.audio import SoundLoader

class AudioPlayer():

    def playerBTN(self, xPos=0.5, yPos=0.3):    
        return MDRectangleFlatButton(text='X', pos_hint={
                                    'center_x': xPos, 'center_y': yPos},
                                    on_release=self.btnfunc)
    
    def btnfunc(self, obj):
        print('WORKS')

的按钮文件,当我单击按钮时,什么也没发生。没有错误,没有声明。 我尝试解决这个问题太久了,但这可能是愚蠢的事情。


问题在于,在 AudioPlayer 类中, self 指的是 AudioPlayer 的实例,而不是按钮。因此,当你将 self.btnfunc 指定为回调时,它没有被绑定到按钮实例。

可以通过以下两种方法之一解决此问题:

1. 使用 partial 函数:

可以使用 functools.partial 函数创建一个绑定了 AudioPlayer 实例作为第一个参数的新函数。

from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from audio_player import AudioPlayer
from functools import partial

class Demo(MDApp):
    def build(self):
        screen = MDScreen()
        player = AudioPlayer()

        btn = player.playerBTN()
        screen.add_widget(btn)
        return screen


if __name__ == '__main__':
    Demo().run()
from kivymd.uix.button import MDRectangleFlatButton
from kivy.core.audio import SoundLoader
from functools import partial

class AudioPlayer():

    def playerBTN(self, xPos=0.5, yPos=0.3):    
        return MDRectangleFlatButton(text='X', pos_hint={
                                    'center_x': xPos, 'center_y': yPos},
                                    on_release=partial(self.btnfunc, self)) # 使用 partial

    def btnfunc(self, instance, obj): # 添加 instance 参数
        print('WORKS')

2. 使用 lambda 函数:

可以在 on_release 回调中使用 lambda 函数来调用 btnfunc 并将 self 作为参数传递。

from kivymd.uix.button import MDRectangleFlatButton
from kivy.core.audio import SoundLoader

class AudioPlayer():

    def playerBTN(self, xPos=0.5, yPos=0.3):    
        return MDRectangleFlatButton(text='X', pos_hint={
                                    'center_x': xPos, 'center_y': yPos},
                                    on_release=lambda x: self.btnfunc(self, x)) # 使用 lambda

    def btnfunc(self, instance, obj): # 添加 instance 参数
        print('WORKS')

这两种方法都会将 self (即 AudioPlayer 实例)传递给 btnfunc ,以便可以从按钮回调中访问它。

标签:python,class,kivy,kivymd
From: 78849803

相关文章