如何使用方法更改按钮的 on_release 功能?

Posted

技术标签:

【中文标题】如何使用方法更改按钮的 on_release 功能?【英文标题】:How to change on_release function of a button using a method? 【发布时间】:2020-12-31 03:18:15 【问题描述】:

我目前正在设计一款 android 音乐播放器应用。它在播放歌曲时一切正常。现在,我想要的是,当我们单击播放按钮时,它会将其图像更改为暂停,第一次单击它将播放歌曲。当我们在它的图像是暂停图像时单击它,歌曲就会暂停。简单来说,就是想改变按钮的on_release动作和点击按钮时的图片。

您不必担心如何播放和暂停。我只是想知道当我们点击它时如何改变按钮的功能和上面的图像。

我当前的程序如下所示:

from kivy.lang import Builder
from kivymd.uix.list import OneLineListItem
from kivymd.app import MDApp
from kivy.core.audio import SoundLoader
import os

helper_string = """
Screen:
    BoxLayout:
        orientation: "vertical"
        ScrollView:
            MDList:
                id: scroll
        MDRoundImageButton:
            id: play_button
            source: "F:/playbutton.png"
            pos_hint: "center_x":0.5,"center_y":0.5
            on_release: app.song_player_on_release_play_button()

"""


class MainApp(MDApp):
    def build(self):
        screen = Builder.load_string(helper_string)
        return screen

    def on_start(self):
        for root, dirs, files in os.walk('C:/'):
            for file in files:
                if file.endswith('.mp3'):
                    required_file = file
                    the_location = os.path.abspath(required_file)
                    self.root.ids.scroll.add_widget(OneLineListItem(text=required_file, on_release=self.play_song))
                    # print(required_file)

    def play_song(self, onelinelistitem):
        SongList = []
        # print('play:', onelinelistitem.text)
        the_song_path = onelinelistitem.secondary_text
        SongList.append(the_song_path)
        if len(SongList) == 1:
            sound = SoundLoader.load(SongList[0])
            if sound:
                sound.play()
            print(the_song_path)
        if len(SongList) > 1:
            SoundLoader.load(SongList[0]).stop()
            sound = SoundLoader.load(SongList[1])
            if sound:
                sound.play()
            print(the_song_path)

    def song_player_on_release_play_button(self):
        self.root.ids.play_button.source = "F:/pause button.png"
        self.root.ids.play_button.on_release = self.song_player_on_release_pause_button()

    def song_player_on_release_pause_button(self):
        self.root.ids.play_button.on_release = self.song_player_on_release_play_button()
        self.root.ids.play_button.source = "F:/playbutton.png"


MainApp().run()

在上面的代码中,我认为如果我使用self.root.ids.play_button.on_release,那么它会改变发布功能,但它不起作用。现在,我陷入了困境:如何更改按钮功能及其上的图像?

我是编程新手,我在 Python 中使用 kivy 和 kivymd 来制作这个应用程序。

如果您正在测试这个,请更改图像名称或下载我最初使用的图像:

暂停按钮:

播放按钮:

再次,我希望他们更改彼此的on_release 操作,这意味着当我们单击暂停时它会打印暂停,更改按钮图像以播放。然后,当我们点击播放时,它会打印播放并将按钮图像更改为暂停,这将永远持续......

【问题讨论】:

【参考方案1】:

您不需要为此定义两个函数。在一个功能中,您可以更改播放或暂停图像,如下所示。

    def song_player_on_release_play_button(self, *args):
        if self.root.ids.play_button.source = "F:/playbutton.png":
            self.root.ids.play_button.source = "F:/pause button.png"
        else:
            self.root.ids.play_button.source = "F:/playbutton.png"

【讨论】:

但主要功能是另一个你能告诉我吗? 不明白你的问题,你能澄清一下你的主要功能是什么意思吗?如果您指的是歌曲播放/暂停功能,那么您可以在同一个 if-else 块中添加播放/暂停功能。 好的,让我说得更清楚一点,所以它是一个 else 和 if 语句,但这只会改变按钮源(简而言之按钮上的图像),但我希望同样的事情也暂停一首歌如果它正在播放并播放歌曲,如果它使用这些按钮暂停并且要做到这一点,我想使用 kivy SoundLoader 库。当我们点击按钮时,如果按钮有播放的图像,它将变为暂停,同时歌曲也应该停止,当我们点击暂停按钮时,也会发生同样的情况。我已经想出了如何做到这一点,所以感谢您的帮助@amras

以上是关于如何使用方法更改按钮的 on_release 功能?的主要内容,如果未能解决你的问题,请参考以下文章

kivy 多次执行“on_release”命令

Kivymd on_release 按钮​​使用 MDCard 进行下一步的操作不起作用

kivy:单击 1 次按钮触发多个功能

向 kivy 按钮添加 on_release 操作

动态创建的 kivy 按钮立即运行 on_press 和 on_release

Kivymd 卡按钮功能