Kivy中的Python循环

2024-05-05 15:01:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚学习了Kivy在用Python创建东西时的一些UI选项。我现在正在绞尽脑汁的是循环,以及如何让它们与Kivy一起工作

下面的示例是一个非常简单的循环,它应该将每个数字打印到一个Kivy标签上(替换以前的)

目前,当按下按钮时,我只得到屏幕上的最后一个数字,因为整个功能完全运行-这是有意义的。但我的问题是如何设置按钮,以便在按下按钮时,它只运行循环的一次迭代

My.py文件:

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.widget import Widget

Window.size=(300,300)
Builder.load_file('loop.kv')


class MyLayout(Widget):
    def loop(self):
        for i in range(10):
            self.ids.label_print.text = str(i)
    pass


class LoopApp(App):
    def build(self):
        return MyLayout()

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

我的.kv文件:

<MyLayout>
    BoxLayout:
        orientation: 'vertical'
        size: root.height, root.width

        Label:
            id: label_print
            font_size: 32
        Button:
            text: 'Loop'
            on_press: root.loop()

目前,结果只显示9,我希望从0开始,每次按下按钮都添加1:

enter image description here


Tags: 文件fromimportselfloopappsizebuilder
1条回答
网友
1楼 · 发布于 2024-05-05 15:01:03

基本上,您的循环工作正常,但立即发生,因此您只能看到9,而不能看到序列或任何内容。您可以使用kivy.clock为回调函数安排一个间隔,指定间隔时间并在某个点停止该计划。如果您想跳过kivy.clock部分,您的GUI将被冻结,直到函数完成。例如:

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.clock import Clock
from timeit import time

Window.size=(300,300)
Builder.load_file('loop.kv')


class MyLayout(Widget):
    loop_thread = None

    def callback_to_loop(self, dt):  # dt is the interval-time
        # this is required because initially the text is an empty string
        try:
            current = int(self.ids.label_print.text)
        except:
            current = 0

        # simply add up the numbers 
        self.ids.label_print.text = str(current+1)

        # stop at a certain point and unschedule the thread
        if current == 11:
            Clock.unschedule(self.loop_thread)

    def loop(self):
        # schedule the thread with an interval-time = 1
        self.loop_thread = Clock.schedule_interval(self.callback_to_loop, 1)

    pass


class LoopApp(App):
    def build(self):
        return MyLayout()

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

相关问题 更多 >