KivyMD中独立类与文件内按钮点击无响应问题求助
问题原因
你的代码里,AudioPlayer是普通Python类,而且在main.py的build方法中,player是局部变量。当build方法执行完毕返回screen后,这个局部变量会被Python的垃圾回收机制清理掉。而按钮的on_release绑定的是player实例的btnfunc方法,一旦player被回收,这个回调方法也会失效,所以点击按钮既无输出也无报错。
解决方法
以下两种方案任选其一即可:
方案1:让AudioPlayer继承Kivy Widget
把AudioPlayer改成Kivy的Widget子类,这样它会被Kivy的组件树持有引用,不会被垃圾回收。
修改后的audio_player.py:
from kivymd.uix.button import MDRectangleFlatButton from kivy.uix.widget import Widget class AudioPlayer(Widget): 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')
方案2:将player保存为Demo类的实例属性
在Demo类中把player定义为实例属性,通过类实例持有它的引用,避免被回收。
修改后的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() self.player = AudioPlayer() btn = self.player.playerBTN() screen.add_widget(btn) return screen if __name__ == '__main__': Demo().run()
修改后运行代码,点击按钮就能正常打印WORKS了。
内容的提问来源于stack exchange,提问作者Code Freak
相关产品推荐
相关产品推荐

