要构建一个简单的进度栏还是在Kivy中加载动画? [英] Building a simple progress bar or loading animation in Kivy?

查看:49
本文介绍了要构建一个简单的进度栏还是在Kivy中加载动画?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我开发的cmd线路实用程序编写Kivy UI.一切正常,但是某些过程可能需要花费几秒钟到几分钟的时间,我想向用户提供一些有关该过程正在运行的指示.理想情况下,它可以是纺车或装载杆之类的形式,但是即使我可以更新显示以向用户显示某个进程正在运行,它也将比我现在拥有的更好.

I am writing a Kivy UI for cmd line utility I have developed. Everything works fine, but some of the processes can take from a few seconds to a few minutes to process and I would like to provide some indication to the user that the process is running. Ideally, this would be in the form of a spinning wheel or loading bar or something, but even if I could update my display to show the user that a process is running, it would be better than what I have now.

当前,用户按下主UI中的按钮.这会弹出一个弹出窗口,与用户一起验证一些关键信息,如果他们对这些选项感到满意,则可以按下运行"按钮.我尝试打开一个新的弹出窗口来告诉他们该进程正在运行,但是因为直到该进程完成才显示更新,所以这是行不通的.

Currently, the user presses a button in the main UI. This brings up a popup that verifies some key information with the user, and if they are happy with those options, they press a 'run' button. I have tried opening a new popup to tell them that the process is running, but because the display doesn't update until the process finishes, this doesn't work.

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

I have a lot of coding experience, but mostly in the context of math and engineering, so I am very new to the designing of UIs and having to handle events and threads. A simple self-contained example would be greatly appreciated.

推荐答案

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

I was recently tackling the problem you described: display doesn't update until the process finishes

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

Here is a complete example that I got working with the help of @andy_s in the #Kivy IRC channel:

我的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()

我的example.kv:

My example.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秒钟后,弹出窗口将自动关闭.

If you run this example, you can click the Click Me button, which should open up a "progress bar" in the form of a modal/pop-up. This pop up will remain open for 5 seconds without blocking the main window. After 5 seconds, the pop up will automatically be dismissed.

这篇关于要构建一个简单的进度栏还是在Kivy中加载动画?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆