如何在kivy中制作圆形进度条?

     2023-02-15     58

关键词:

【中文标题】如何在kivy中制作圆形进度条?【英文标题】:How to make circular progress bar in kivy? 【发布时间】:2018-11-05 16:04:11 【问题描述】:

我想用 kivy 和 python 制作一个简单的圆形进度条。我搜索了在线文档和 GitHub 曲目,但没有找到解释循环进度条概念的正确示例。

如下图所示。我想发展。请任何人帮助我解决这个问题。

【问题讨论】:

我已经改进了我的最后一个答案以添加文本和更简单的可用性,希望这会有所帮助。 【参考方案1】:

新的更好的版本

这篇文章受到的关注比我预期的要多,因此我决定花一点精力来创建这个小部件的升级版本。现在可以在GitHub 上找到它。这是一个可以用它做什么的示例(进度条实际上是透明的,我在 gif 中添加了黑色背景以使所有内容都可见):

如果有人感兴趣,我将保留旧帖子以供参考。

旧帖

我制作了一个小部件来代表您想要实现的目标。但是,确切地说,有一些限制:

    您需要调用set_value 方法,而不仅仅是使用.value 设置进度条值。我非常不确定应该做些什么来实现与原始 ProgressBar 类中相同的行为;

    你必须指定大小才能实现圆形,因为对象本身就是一个椭圆。

这里是代码,还有示例用法:

from kivy.app import App
from kivy.uix.progressbar import ProgressBar
from kivy.core.text import Label as CoreLabel
from kivy.lang.builder import Builder
from kivy.graphics import Color, Ellipse, Rectangle
from kivy.clock import Clock


class CircularProgressBar(ProgressBar):

    def __init__(self, **kwargs):
        super(CircularProgressBar, self).__init__(**kwargs)

        # Set constant for the bar thickness
        self.thickness = 40

        # Create a direct text representation
        self.label = CoreLabel(text="0%", font_size=self.thickness)

        # Initialise the texture_size variable
        self.texture_size = None

        # Refresh the text
        self.refresh_text()

        # Redraw on innit
        self.draw()

    def draw(self):

        with self.canvas:
            
            # Empty canvas instructions
            self.canvas.clear()

            # Draw no-progress circle
            Color(0.26, 0.26, 0.26)
            Ellipse(pos=self.pos, size=self.size)

            # Draw progress circle, small hack if there is no progress (angle_end = 0 results in full progress)
            Color(1, 0, 0)
            Ellipse(pos=self.pos, size=self.size,
                    angle_end=(0.001 if self.value_normalized == 0 else self.value_normalized*360))

            # Draw the inner circle (colour should be equal to the background)
            Color(0, 0, 0)
            Ellipse(pos=(self.pos[0] + self.thickness / 2, self.pos[1] + self.thickness / 2),
                    size=(self.size[0] - self.thickness, self.size[1] - self.thickness))

            # Center and draw the progress text
            Color(1, 1, 1, 1)
            #added pos[0]and pos[1] for centralizing label text whenever pos_hint is set
            Rectangle(texture=self.label.texture, size=self.texture_size,
                  pos=(self.size[0] / 2 - self.texture_size[0] / 2 + self.pos[0], self.size[1] / 2 - self.texture_size[1] / 2 + self.pos[1]))


    def refresh_text(self):
        # Render the label
        self.label.refresh()

        # Set the texture size each refresh
        self.texture_size = list(self.label.texture.size)

    def set_value(self, value):
        # Update the progress bar value
        self.value = value

        # Update textual value and refresh the texture
        self.label.text = str(int(self.value_normalized*100)) + "%"
        self.refresh_text()

        # Draw all the elements
        self.draw()


class Main(App):

    # Simple animation to show the circular progress bar in action
    def animate(self, dt):
        if self.root.value < 80:
            self.root.set_value(self.root.value + 1)
        else:
            self.root.set_value(0)

    # Simple layout for easy example
    def build(self):
        container = Builder.load_string(
            '''CircularProgressBar:
    size_hint: (None, None)
    height: 200
    width: 200
    max: 80''')

        # Animate the progress bar
        Clock.schedule_interval(self.animate, 0.1)
        return container


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

输出:

【讨论】:

如果可能的话,你会建议我如何为上面的单个 python 文件为 kivy 和 python 制作单独的文件。不改变功能 是否可以手动设置圆形进度条的值而不是自更新,例如在kivy字符串中定义滑块并对应滑块的值,圆形进度条必须移动并更改圆形进度条内的文本。 您可以像使用ProgressBar 一样使用我的小部件,但您必须在想要设置一个时调用 set_value(value) (查看我提供的示例)。这将自动更新循环和文本进程。关于分离,只需创建一个新模块将类放在那里并将其导入到您想使用的任何地方。据我所知,要在您的 .kv 布局中使用它,您还必须将它与您的主 App 类一起导入模块中。尝试一下,看看你能用它做什么! @NandakishorJahagirdar - 如果您仍然对使用它感兴趣,请查看更新版本的小部件。也许它会被证明更有用!

如何在kivy python中使用滑块作为进度条并控制音频?

】如何在kivypython中使用滑块作为进度条并控制音频?【英文标题】:howtousesliderasprogressbarandcontrolaudioinkivypython?【发布时间】:2021-01-0101:53:19【问题描述】:我正在为android制作音乐播放器,现在我可以成功播放和暂停歌曲,但问... 查看详情

Kivy:如何在 kivy 中制作圆角 TextInput?

】Kivy:如何在kivy中制作圆角TextInput?【英文标题】:Kivy:HowdoyoumakearoundedTextInputinkivy?【发布时间】:2021-11-0323:26:31【问题描述】:我研究过的伙计们,但这一切都太少了。我发现的只是这个:Kivy:TextInputborderradius。所以你们能告... 查看详情

我如何在我的异步任务类中使用圆形旋转进度条

】我如何在我的异步任务类中使用圆形旋转进度条【英文标题】:Howicanusecircularspinningprogressbarinmyasynctaskclass【发布时间】:2019-06-0221:46:09【问题描述】:我想在asynctask类中使用旋转进度条。下面是我的asynctask类代码。在我使用... 查看详情

纯css3制作圆形进度条所遇到的问题

  近日在开发的页面中,需要制作一个动态的圆形进度条,首先想到的是利用两个矩形,宽等于直径的一半,高等于直径,两个矩形利用浮动贴在一起,设置overflow:hidden属性,作为盒子,内部有一个与其宽高相等的子盒子,... 查看详情

Visual Basic 圆形进度条

...制作一个具有良好UI的软件,但我在VB方面并不专业......如何制作圆形进度条?举例【问题讨论】:见codeproject.com/Articles/30625/Circular-Progress-Indicator和codeproject.com/Art 查看详情

ios制作个圆形进度条

参考技术A1.需要做个这样的圆形进度条 自定义弹窗view就不说了,主要是这个圆形进度view,底色是灰色然后有进度灰色被黑色覆盖或者说变成黑色首先我们自定一个view,加个uilabel做进度lbael@property(nonatomic,strong)UILabel*percentLabel;/... 查看详情

如何在 QT 中获得具有圆形边缘和圆形进度边缘的 QProgressBar?

】如何在QT中获得具有圆形边缘和圆形进度边缘的QProgressBar?【英文标题】:HowtogetaQProgressBarinQTwithroundededgesandroundedprogressedges?【发布时间】:2016-03-1723:20:32【问题描述】:我创建了一个垂直进度条,并尝试使用圆角设置它的样... 查看详情

如何创建圆形样式进度条

】如何创建圆形样式进度条【英文标题】:HowtocreateaCircularStyleProgressBar【发布时间】:2011-06-1918:24:09【问题描述】:我需要帮助来实现这样的循环进度条:我应该如何通过增加Value属性来实现Circle来填充?【问题讨论】:相关链... 查看详情

带有图像和圆形进度条的圆形按钮

...【发布时间】:2019-12-2819:29:53【问题描述】:我正在尝试制作一个按钮,里面有一个图像,外面有一个圆形进度条,按下按钮后是彩色的。我有一个.svg图像,它必须显示在一个直径为140像素的圆圈中。此图片必须是触发请求并... 查看详情

如何在 WPF 中制作选取框进度条?

】如何在WPF中制作选取框进度条?【英文标题】:HowdoImakeamarqueeprogressbarinWPF?【发布时间】:2010-10-1222:12:03【问题描述】:在Winforms中,我可以将进度条的ProgressBarStyle设置为Marqee,对于我不知道它需要多长时间的进程,这将在无... 查看详情

如何在Android中制作这个进度条? [关闭]

】如何在Android中制作这个进度条?[关闭]【英文标题】:HowtomakethisprogressbarinAndroid?[closed]【发布时间】:2017-09-0907:46:53【问题描述】:我想在android中制作这个进度条【问题讨论】:欢迎来到SO..在发布问题***.com/help/how-to-ask之前... 查看详情

在 Kivy 中构建简单的进度条或加载动画?

】在Kivy中构建简单的进度条或加载动画?【英文标题】:BuildingasimpleprogressbarorloadinganimationinKivy?【发布时间】:2015-08-1605:38:59【问题描述】:我正在为我开发的命令行实用程序编写KivyUI。一切正常,但有些进程可能需要几秒钟... 查看详情

圆形进度条 Android

...有自己的时间限制。有一个iOS应用pTimer+,我想在Android中制作类似的倒数计时器。(来源:jiaojianli.com)到目前为止,我能够实现类似于倒数计时器但没有段或块概念的圆形进度条。【问题讨论】:【 查看详情

如何使用 Swift 在 UIView 中将圆形进度条居中?

】如何使用Swift在UIView中将圆形进度条居中?【英文标题】:HowcanIcentreacircularprogressbarinaUIViewusingSwift?【发布时间】:2020-09-0119:53:23【问题描述】:我很难确保圆形进度条始终位于与其关联的UIView的中心。这是正在发生的事情:... 查看详情

如何重新加载圆形进度条

】如何重新加载圆形进度条【英文标题】:howtoreloadacircularprogressbar【发布时间】:2015-12-0921:59:58【问题描述】:我对画布以及如何创建圆形进度条进行了一些网络搜索,我得到了这个。我对在网上找到的代码片段进行了一些更... 查看详情

如何在Android中创建一个在其上旋转的圆形进度条?

】如何在Android中创建一个在其上旋转的圆形进度条?【英文标题】:HowtoCreateacircularprogressbarinAndroidwhichrotatesonit?【发布时间】:2014-02-1512:25:24【问题描述】:我正在尝试创建一个圆形进度条。这就是我想要实现的目标有一个灰... 查看详情

如何给progressbar圆形进度条设置颜色

参考技术AAndroid中ProgressBar自定义进度条的高度、颜色、圆角很多人知道怎么改颜色,可是改高度就是胡扯了,居然想通过maxHeight去改。准确方法在这里:下面这个改成了3-5个dp高度:首先是样式文件,这里定义高度:本回答被... 查看详情

如何在 wpf 中制作多色分段进度条?

】如何在wpf中制作多色分段进度条?【英文标题】:HowcanImakeamulti-coloredsegmentedprogressbarinwpf?【发布时间】:2015-11-1306:43:19【问题描述】:我正在尝试创建一个用作分段进度条的UserControl。输入是对象的集合,每个对象都有一个类... 查看详情