我刚刚开始使用 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
,以便可以从按钮回调中访问它。