首页 > 解决方案 > 在 kivy 标签上生成随机数

问题描述

我想在类似于倒计时动画的 kivy 标签上显示随机生成的数字。

原型.py(python文件):

    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.uix.boxlayout import BoxLayout
    import random
    import time


    class RootWidget(BoxLayout):
        def do(self):
            a = 0
            total = 5
            user = self.ids.name
            while a <= 10:
                randnum = random.randrange(total)
                user.text = str(randnum)

                a+=1


    class prototypeApp(App):
        def build(self):
            return RootWidget()

    if __name__ == "__main__":
        no=prototypeApp()
        no.run()

原型.kv(kv 文件):

    <RootWidget>:
        orientation:'vertical'
        Label:
            id: name
            text:''
            font_size:70
            height:70
        Button:
            text:'click me'
            on_release:app.root.do()
            size_hint_y:.1

没有错误,但在标签上,它只显示随机生成的数字的最后一个数字。但我希望循环中的数字在标签上顺畅流动,而不是只显示循环中的最后一个数字。

标签: pythonhtmlpython-3.xkivy

解决方案


该方法中的循环在do()主线程上运行,主线程与更新 GUI 的线程相同。由于它是单线程,因此在您的方法完成之前无法更新 GUI do(),这意味着只有最后一个随机数会显示在 GUI 中。

要解决此问题,请在单独的线程中运行该循环(请参阅threading)。而且您将需要self.ids.name.text = str(randnum)在主线程上执行后面的操作(考虑使用Clock来完成该操作)。

您可能希望在循环中添加一个睡眠,否则它可能会发生得太快而无法看到中间数字。


推荐阅读