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

     2023-04-14     225

关键词:

【中文标题】在 Kivy 中构建简单的进度条或加载动画?【英文标题】:Building a simple progress bar or loading animation in Kivy? 【发布时间】:2015-08-16 05:38:59 【问题描述】:

我正在为我开发的命令行实用程序编写 Kivy UI。一切正常,但有些进程可能需要几秒钟到几分钟的时间来处理,我想向用户提供一些指示,表明该进程正在运行。理想情况下,这将是一个旋转轮或加载栏或其他东西的形式,但即使我可以更新我的显示以向用户显示一个进程正在运行,它也会比我现在拥有的更好。

目前,用户在主 UI 中按下按钮。这会弹出一个弹出窗口,向用户验证一些关键信息,如果他们对这些选项感到满意,他们会按下“运行”按钮。我已经尝试打开一个新的弹出窗口来告诉他们进程正在运行,但是因为在进程完成之前显示不会更新,所以这不起作用。

我有很多编码经验,但主要是在数学和工程方面,所以我对 UI 设计和处理事件和线程非常陌生。一个简单的独立示例将不胜感激。

【问题讨论】:

见this example。也许您可以在自己的应用中使用它。 【参考方案1】:

我最近正在解决您描述的问题:display doesn't update until the process finishes

这是我在#Kivy IRC 频道中@andy_s 的帮助下完成的一个完整示例:

我的 main.py:

from kivy.app import App
from kivy.uix.popup import Popup
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivy.clock import Clock

import time, threading

class PopupBox(Popup):
    pop_up_text = ObjectProperty()
    def update_pop_up_text(self, p_message):
        self.pop_up_text.text = p_message

class ExampleApp(App):
    def show_popup(self):
        self.pop_up = Factory.PopupBox()
        self.pop_up.update_pop_up_text('Running some task...')
        self.pop_up.open()

    def process_button_click(self):
        # Open the pop up
        self.show_popup()

        # Call some method that may take a while to run.
        # I'm using a thread to simulate this
        mythread = threading.Thread(target=self.something_that_takes_5_seconds_to_run)
        mythread.start()

    def something_that_takes_5_seconds_to_run(self):
        thistime = time.time() 
        while thistime + 5 > time.time(): # 5 seconds
            time.sleep(1)

        # Once the long running task is done, close the pop up.
        self.pop_up.dismiss()

if __name__ == "__main__":
    ExampleApp().run()

我的例子.kv:

AnchorLayout:
    anchor_x: 'center'
    anchor_y: 'center'
    Button:
        height: 40
        width: 100
        size_hint: (None, None)
        text: 'Click Me'
        on_press: app.process_button_click()

<PopupBox>:
    pop_up_text: _pop_up_text
    size_hint: .5, .5
    auto_dismiss: True
    title: 'Status'   

    BoxLayout:
        orientation: "vertical"
        Label:
            id: _pop_up_text
            text: ''

如果您运行此示例,您可以单击Click Me 按钮,该按钮应以模式/弹出窗口的形式打开“进度条”。此弹出窗口将保持打开 5 秒钟而不会阻塞主窗口。 5秒后,弹窗会自动消失。

【讨论】:

感谢@Dirty Penguin 的建议。我一直在玩这个,从线程开始,有一个非常奇怪的问题。当我点击我的应用内运行按钮时,我没有调用我的函数,而是调用了一个启动器,它生成一个“正在运行”的弹出窗口并使用我的函数启动一个线程。问题是当作为线程运行时,该函数会做一些奇怪的事情。基本上,我的函数会生成一个基于 csv 的按钮表,当作为线程运行时,其中一些按钮是白色的且不可点击。每次都是不同的按钮,如果我不将它作为单独的线程运行,它就会消失。想法? 原来这些奇怪的按钮是可点击的,它们看起来与我网格中的其他按钮莫名其妙地不同。通常是 1 或 4 个按钮(大约 60 个按钮)来执行此操作。所有其他按钮都有默认的填充颜色,但是这些奇怪的按钮有白色填充,并且在单击时不会突出显示。我能够告诉它们是可点击的唯一方法是将打印绑定到它们。 您应该只在主线程中更改小部件。 github.com/kivy/kivy/issues/6244【参考方案2】:

我已经处理过类似的问题,但创建新线程并没有解决问题。我不得不使用Clock.schedule_once(new_func) 函数。它将函数调用安排到下一帧,因此它几乎会在回调结束后立即运行。

【讨论】:

【参考方案3】:

我遇到了这个问题,但发现这里的讨论有点超出我的理解。

我查看了很多答案,但在我对线程模块进行更多研究之前,没有任何意义。 Discord 上的 Kivy 支持频道也非常有帮助,因此对他们很有帮助。

我的解决方法是创建一个加载屏幕。我将在此处附上代码,供同样需要简单可重现代码 sn-p 的人使用:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, ListProperty, StringProperty, 
NumericProperty
import threading
import time
from kivy.clock import mainthread


class WindowManager(ScreenManager):
    pass

class WelcomeWindow(Screen):

    def generateData(self):
        data = []
        for i in range (100):
            #print(i)
            data.append(i)
        time.sleep(3)
        self.set_screen()
        return data

def executeFunc(self):
    self.manager.current = 'Loading' # Here is where I have tried to move to loading screen while func runs
    t1 = threading.Thread(target=self.generateData)# Here is where I have tried to thread the function
    t1.start()
    #t1.join() #Here is where I have tried to wait until func finished before changing screen
    #self.manager.current = 'Final'

@mainthread
def set_screen(self):
    self.manager.current = 'Final'



class LoadingWindow(Screen):
    pass

class FinalWindow(Screen):
    pass

KV = '''
WindowManager:
    WelcomeWindow:
    LoadingWindow:
    FinalWindow:

<WelcomeWindow>:
    name:'Welcome'
    BoxLayout:
        Label:
            text: "JUST SOME TEXT"
        Button:
            text: "Generate Data"
            font_size: sp(30)
            size_hint: .4,.4
            on_release:
                root.executeFunc()
                #app.root.current = "Loading"
                root.manager.transition.direction = "left"

<LoadingWindow>:
    name: 'Loading'
    BoxLayout:
        Label: 
            text: "LOADING SCREEN"
        Button:
            text: "Go Back"
            on_release:
                app.root.current = "Welcome"
                root.manager.transition.direction = "right"
                
<FinalWindow>:
    name: 'Final'
    BoxLayout:
        Label: 
            text: "FINISHED"
'''''

class TestApp(App):
    def build(self):
        return Builder.load_string(KV)

TestApp().run()

【讨论】:

如何在加载图像时添加进度条或循环进度此代码(颤振)?我尝试了不同的解决方案,但没有运气:(

】如何在加载图像时添加进度条或循环进度此代码(颤振)?我尝试了不同的解决方案,但没有运气:(【英文标题】:HowcanIaddaprogressbarorCircularProgressthiscode(Flutter)whileanimageisloading?Ihavetrieddifferentsolutionsbutnoluck:(【发布时间】:2021-0... 查看详情

Kivy:为长功能加载动画(避免冻结)

】Kivy:为长功能加载动画(避免冻结)【英文标题】:Kivy:Loadinganimationforlongfunction(avoidfreeze)【发布时间】:2021-07-1410:58:55【问题描述】:我有这样的问题:我的应用程序在长功能期间冻结如果用户在加载过程中多次点击,会进... 查看详情

如何在 Kivy 中制作重复的旋转动画?

...】:2017-05-1008:42:31【问题描述】:我想制作一个可以旋转加载微调器图像的动画小部件。我查看了Animation课程,似乎它可以完成这项工作。但是我找不到一种方法来不断地在一个方向上旋转小部件这是我的代码:fromkivy.appimportApp... 查看详情

如何在 Kivy 中将图像放入动态文本中

...所述字符串中显示图像的线索。这个问题的答案是为这些构建一个新的布局,在这种情况下是TextWrapper。示例代码:from 查看详情

加快加载动画 gif kivy

】加快加载动画gifkivy【英文标题】:speeduploadingofanimatedgifkivy【发布时间】:2016-02-2100:37:37【问题描述】:有没有办法加快kivy加载动画gif的速度?kivy是否有任何内置方法,例如压缩或其他选项?我正在做的是使用动画gif作为我... 查看详情

加载 webview 时加载动画卡住/冻结

...载动画,当来自Alamofire的响应到来时,我使用部分响应来构建我需要在wkwebview中加载的完整url,然后触发webview.load(..)。我的问题是,一旦webview.load(..)开始发生,进度 查看详情

从数据库中检索数据时如何显示加载动画或进度条?

】从数据库中检索数据时如何显示加载动画或进度条?【英文标题】:Howtoshowloadinganimationsorprogressbarswhenretrievedatafromdatabase?【发布时间】:2015-04-3017:30:41【问题描述】:每次访问此页面时,我都会从数据库中检索大约15,000行。该... 查看详情

在 Nuxt 中切换导航动画

...到视图时,我有一个使用GSAP的简单动画。我正在Nuxt/Vue中构建这个网站(这对我来说是新的)所以我认为问题可能在于我如何构建我的功能。我的导航切换按钮和导航布局位于两个独立的组件中,因此我使用Vuex在它们之间传递... 查看详情

如何在 SwiftUI 中观察 WKWebView 的加载进度?

...时间】:2020-09-2104:36:37【问题描述】:我正在使用SwiftUI构建一个Web浏览器,并将视图分为3个部分:SearchView、WebView(UIViewRepresentable)。在SearchView中,我有@Bindingvarque 查看详情

在 Tkinter 中从 Web 中提取数据时制作加载动画

...的过程中经过了一点时间,我想在画布上显示加载动画或进度条。从理论上讲,我设法做到了,它应该在进度条开始提取数据并在提取数据后停止但它不起作用时工作 查看详情

android之自定义圆形进度条

...为友好页面以提高用户体验。对于这样的进度条,最简单的实现方式就是通过美工给我们切几张不同的图片,最后通过帧动画的方式来实现。通过帧动画实现固然可以,但是对美工的依赖很大。所以 查看详情

Kivy:用画布为图像制作动画的正确方法是啥?

...带有动画的图像。查看附加的sn-p,我在其中将动画图标加载到图像中并同时执行以下操作:(1)add_widget图片(2)创 查看详情

文本输入突然停止在 Kivy 应用程序中工作

...ivyapp【发布时间】:2020-08-1713:36:43【问题描述】:我正在构建一个带有几个屏幕的简单Kivy应用程序。第一个屏幕有几个按钮,点击后会移动到第二个屏幕。第二个屏幕有一个文本输入小部件和一个浮动布局内的按钮。布局通过Bu... 查看详情

在 Kivy/Python 中作为线程运行时表现奇怪的函数

...Python【发布时间】:2015-08-1902:37:48【问题描述】:我正在构建一个应用程序,当用户点击“运行”按钮时,它会生成一个按钮表。因为这个过程需要一段时间,所以我想添加一个弹出窗口或进度条来提醒用户该函数正在运行并且... 查看详情

为啥自定义进度条在android中没有动画?

】为啥自定义进度条在android中没有动画?【英文标题】:WhyCustomprogressbarisnotanimatinginandroid?为什么自定义进度条在android中没有动画?【发布时间】:2017-07-2100:57:20【问题描述】:在可能的应用程序中,我实现了自定义进度条,... 查看详情

如何在buildozer中构建kivy和twisted(代码片段)

...序。它在我的开发环境中运行良好,但是我无法使用我的构建器设置来使用应用程序正确编译。有关哪些最低设置是强制要求buildozer正确编译的任何想法?我试过简单地在需求部分添加“twisted”,但显然这还不够......我可以分... 查看详情

在kivy中隐藏android键盘

...inkivy【发布时间】:2017-03-1900:34:53【问题描述】:我正在构建一个具有多个屏幕的简单应用程序,并且我一直在处理显示下一个屏幕后没有隐藏的android键盘。我查看了互联网并没有找到解决此问题的解决方案。下面是我找到here... 查看详情

如何在使用 Chaquopy 时在 android 中显示加载动画

...hon,但是当我单击按钮时,我面临加载动画的问题,比如进度条不起作用,应用程序移动到python代码和java文件卡住并且当时没有响应显示正在加载pyhon代码的动画,谁 查看详情