如何在kivy recycleview中仅选择一个按钮

2023-12-05

我正在使用 kivy recycleview 创建一个 mp3 播放器,该应用程序在播放列表屏幕中有很多按钮,每当您单击某个按钮时,该按钮的图标就会从“播放”更改为“暂停”,反之亦然。

我想知道如何以单击另一个按钮将所有其他按钮图标更改为“播放”的方式,只有选定的按钮应该带有“暂停”图标。

.py 文件:

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.core.window import Window
from kivy.properties import StringProperty, ObjectProperty
from kivymd.theming import ThemableBehavior
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.screen import MDScreen
from kivymd.uix.behaviors import RectangularRippleBehavior
from kivy.uix.behaviors import ButtonBehavior

from kivy.clock import Clock

Builder.load_file('playlist.kv')

KV = """
#:import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManager:
    transition: FadeTransition()

    Playlist:
        name: "playlist screen"

"""

class Playlist(ThemableBehavior, MDScreen):
    rv = ObjectProperty()
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(self._finish_init)

    def music_list(self):
        return ['audio '+str(i) for i in range(1, 121)]

    def _finish_init(self, dt):
        self.set_list_musics()
        
    def set_list_musics(self):
        """Builds a list of audios for the screen Playlist."""
        print(self.ids)

        def add_music_item(num, sura, secText, icon):
            self.ids.rv.data.append(
                {
                    "viewclass": "MusicListItem",
                    "number": num,
                    "text": sura,
                    "secondary_text": secText,
                    "icon": icon,
                    "callback": lambda x:x})
    
        for i in range(len(self.music_list())):
            music = self.music_list()
            add_music_item(str(i+1), music[i], '00:00:00', 'play')
         
    
class MusicListItem(ThemableBehavior, RectangularRippleBehavior, ButtonBehavior, MDBoxLayout):
    text = StringProperty()
    secondary_text = StringProperty()
    number = StringProperty()
    icon = StringProperty()
    
    def on_release(self, *args):
        if self.icon == "play":
            self.icon = "pause"
        else:
            self.icon = "play"
    
    
class Mp3Player(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
       
    def build(self):
        self.theme_cls.primary_palette = "Purple"
        self.theme_cls.theme_style = "Dark"
        return Builder.load_string(KV)


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

.kv 文件:

#: import gch kivy.utils.get_color_from_hex
#: import StiffScrollEffect kivymd.effects.stiffscroll.StiffScrollEffect

<Playlist>
    md_bg_color: gch("#5D1049")
        
    MDGridLayout:
        cols: 1
        
        MDToolbar:
            left_action_items: [["menu", lambda x: x]]
            right_action_items: [["magnify", lambda x: x]]
            elevation: 10
            md_bg_color: 75/255, 6/255, 54/255, 1
            title: 'Playlist'
            pos_hint: {'top':1}
                    
        MDBoxLayout:
            orientation: 'vertical'
           
            RecycleView:
                id: rv
                effect_cls: 'ScrollEffect'
                viewclass: 'MusicListItem'

                RecycleBoxLayout:
                    padding: dp(10)
                    default_size: None, dp(60)
                    default_size_hint: 1, None
                    size_hint_y: None
                    height: self.minimum_height
                    orientation: 'vertical'

     
<MusicListItem>
    size_hint_y: None
    padding: dp(14)
    height: dp(60)

    canvas:
        Color:
            rgba:
                self.theme_cls.divider_color
        Line:
            points: (root.x+dp(10), root.y, root.x+self.width-dp(10)-0, root.y)

    MDBoxLayout:
        orientation: "horizontal"
        pos_hint: {"center_x": .5, "center_y": .5}

        MDBoxLayout:
            orientation: 'horizontal'
            MDBoxLayout:
                orientation: 'vertical'
                size_hint_x: .2
              
                MDLabel:
                    text: root.number
                    font_style: "H6"
                    adaptive_height: True
                
                MDLabel:
                    size_hint_y: .3
                 
            MDBoxLayout:
                orientation: 'vertical'
             
                MDLabel:
                    text: root.text
                    font_style: "Subtitle2"
                    adaptive_height: True
    
                MDLabel:
                    text: root.secondary_text
                    font_style: "Caption"
                    theme_text_color: "Hint"
                    adaptive_height: True

            MDIconButton:
                icon: root.icon          
    

谢谢


因此,据我了解,您希望将一个图标设置为“暂停”,而将其他图标设置为“播放”。执行此操作的一种方法可能是,您必须重新加载RecyclView data每次图标更改时。

  1. 现在提供data通过图标参考(即“播放”或“暂停”)我找到了number属性合适,所以我将其更改为NumericProperty. Thus number = NumericProperty().

  2. 这也需要 kv 发生一些变化,

                MDLabel:
                    text: str(int(root.number))
                    font_style: "H6"
                    adaptive_height: True
  1. To let Playlist了解有关number参考,
    def set_list_musics(self, music_no = 0):
        """Builds a list of audios for the screen Playlist."""
        print(self.ids)
        self.ids.rv.data = [ ] # Since you are appending data and we need to reload everytime.
  1. 进行必要的更改data,
        for i in range(len(self.music_list())):
            new_icon = 'pause' if i+1 == music_no else 'play'
            music = self.music_list()
            add_music_item(str(i+1), music[i], '00:00:00', new_icon)
  1. 现在是最后一部分,通过按钮触发更改,
    def on_release(self, *args):
        if self.icon == "play":
            self.icon = "pause"
            pl = self.parent.parent.parent.parent.parent # Accessing the Playlist according to your design pattern.
            pl.set_list_musics(self.number)
        else:
            self.icon = "play"

请注意,我在“暂停”图标中进行了此更改(即在if self.icon == "play"),因此您也可以自由切换该图标。否则放置它就不可能实现。

也许使用其他设计风格可以更系统地完成这一点。我发现您的设计模式存在一些问题。这(例如调用函数for重复循环等)可能会使其慢一些,因为data增加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在kivy recycleview中仅选择一个按钮 的相关文章

随机推荐

  • ProGuard 仍然显示完整的活动名称

    我正在使用 Proguard 并在我的应用程序中使用此代码 System out println ACTIVITY NAME IS activity getLocalClassName 它在发布模式下打印出活动名称 我认为它应该混淆所有类名
  • torch.optim 对于多维张量返回“ValueError:无法优化非叶张量”

    我正在尝试优化场景顶点的平移torch optim adam 这是来自redner教程系列 在初始设置下效果很好 它尝试通过将所有顶点移动相同的值来优化场景 称为translation 这是原始代码 vertices for obj in
  • 启用 GtkFileChooserDialog 选择文件或文件夹

    使用 GTK Gtk文件选择对话框 我如何允许用户选择文件或文件夹 两者在这里都有效 这可用的行动是互斥的 不幸的是我认为这是不可能的 我在 Transmission 的 创建 torrent 对话框中尝试了一下 最后使用radibox 启
  • FastAPI 中的依赖注入数据模型

    我对 FastAPI 很陌生 我有一个请求 看起来像这样 router post response model EducationInResp async def create Education account education in
  • 哪个库包含 _is_c_termination_complete

    我在将 C 代码与标准库 C 库链接时收到 LNK2019 错误 我需要知道哪些库包含以下功能 is c termination complete acrt initialize acrt uninitialize acrt uniniti
  • 有效查询包含子字符串的列

    给定一个字符串列 其值类似于 123 12 34 56 5 查询所有的最佳方式是什么包含给定编号的记录 12例如 我脑海中的解决方案是 SELECT id FROM things WHERE things path LIKE 12 但据我所
  • ASP.Net5 Startup.cs ConfigurationBuilder [重复]

    这个问题在这里已经有答案了 使用带有 MVC beta 8 的 VS 2015 我收到以下错误 Severity Code Description Project File Line Error CS1503 Argument 1 cann
  • JavaScript 判断动态命名函数是否存在

    我如何检查是否动态地命名对象或函数存在吗 在示例中 var str test var obj str Page str function Page test if typeof obj str function alert ok else
  • 可以为本机 iOS 应用程序指定的捆绑 ID 数量是否有限制?

    我一直尝试为我的本机 iOS 应用程序添加新的捆绑包 ID 尽管系统说它已保存 但当我 30 分钟后返回时 我添加的 ID 已不存在 目前我的应用程序中有 6 个捆绑包 谢谢各位 None
  • 我的对象的 ArrayList,indexOf 问题

    我对 Java 的 ArrayList 有问题 我创建了一个对象 它包含两个属性 x 和 y 现在我已经在 ArrayList 中加载了一些对象 问题是我不知道如何找到我正在搜索的具有 x 属性的某个对象的索引 有什么办法可以做到这一点吗
  • 优化查询

    我有以下功能 CREATE FUNCTION dbo SuiviRupture CodeArticle NVARCHAR 13 CodeSite NVARCHAR 5 CodeStructure NVARCHAR 13 RETURNS ca
  • 比较模型的同一性,但与变量?用减号构造?

    我的团队正在实施一个变体Ceusters 的参照物追踪 在我们的实现中 实体的原始 URI 可以更改 更改为包含 UUID 的内容 但始终保留原始 URI 的链接 例如 Joey rdf type person New York City
  • 反编译的程序集 - 异常代码

    我使用 ILSpy 反编译了一个程序集 其中一个类特别引起了我的注意 public class CustomTextStream NetworkStream private EventHandler
  • 获取 WinRT 中的当前用户

    我是一名 C 开发人员 我已经习惯了旧的Environment CurrentUser 现在我需要在我的 Windows 8 Metro 应用程序 html 和 js 中精确地做到这一点 那么我怎样才能得到它呢 Windows System
  • Lua中使用“#”运算符计算表的长度? [复制]

    这个问题在这里已经有答案了 我使用时有一个问题 计算表的长度 例如 local t a b local t1 a nil print t 2 print t1 1 local t a b local t1 nil a print t 2 p
  • ajax post后使用模型渲染页面

    是否可以发出 ajax post 请求 并在控制器中返回一个模型 然后使用该模型渲染页面 为了说明我的意思 假设我们有一个简单的 ajax 帖子 ajax url Home PostReq data JSON stringify data
  • 命令 `sed -i "s/^ \+//g; s/ \+/\t/g"` 是什么意思?

    我是新来的sed 有人可以帮我解释以下 sed 命令吗 sed i s g s t g 我找到了解释 i谷歌上有选项 但没有对上述模式含义的确切解释 抱歉 由于我们的内部服务器最近正在维护 因此我无法在此处显示示例文件 这意味着我无法访问此
  • 如何重定向到/user/dashboard

    我必须重定向到 user dashboard登录后的页面 但每次我关闭选项卡并再次打开它时 它都会打开默认主页 即 import React from react import isAuthenticated from helpers au
  • 重置/更改 mysql root 密码

    如何重置 更改 mysql root 密码Bitnami wamp 堆栈 我尝试这个solution但这对我不起作用 在bitnami文件夹中没有文件 bin mysqld nt exe 解决问题 1 停止服务 wampstackMySQL
  • 如何在kivy recycleview中仅选择一个按钮

    我正在使用 kivy recycleview 创建一个 mp3 播放器 该应用程序在播放列表屏幕中有很多按钮 每当您单击某个按钮时 该按钮的图标就会从 播放 更改为 暂停 反之亦然 我想知道如何以单击另一个按钮将所有其他按钮图标更改为 播放