在 kivy 中非常频繁地运行函数 (Kivy Clock/FreeClock)

Posted

技术标签:

【中文标题】在 kivy 中非常频繁地运行函数 (Kivy Clock/FreeClock)【英文标题】:Running functions in kivy extremely frequently (Kivy Clock/FreeClock) 【发布时间】:2018-11-25 04:25:21 【问题描述】:

我正在开发一个从蓝牙设备(我只需通过串行模块处理)接收数据的应用程序。我知道该怎么做。但是在 Kivy 中给它一个新的生命 - 显示它 - 会产生一个问题,即一切都与 FPS 同步。我想一直在后台运行该功能,每秒数百次。公平地说,在 10000 个传入数据包中,有 10 个可能有用。因此,如果我要通过时钟调度,它必须(很好)低于每个周期 20 毫秒。简单地说: 我如何独立于 FPS 运行其中一项功能?有没有一种简洁的方法可以将免费版本的时钟仅用于一项功能?是如何实现的? 我想要一个简单的解决方案,我可以重新发明***,但我不想这样做。 任何帮助表示赞赏,谢谢。

【问题讨论】:

【参考方案1】:

您可以为此使用threading。 下面是一个在 kivy 中使用threading 的小例子:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.properties import NumericProperty
import threading
import time

Builder.load_string('''

<MyLayout>:
    Label:
        text: str(root.data)
''')


class MyLayout(BoxLayout):
    data = NumericProperty(0)
    count = 0
    running = True

    def __init__(self,**kwargs):
        super(MyLayout,self).__init__(**kwargs)
        Clock.schedule_once(self.after_init)

    def after_init(self, dt):
        threading.Thread(target=self.func).start()

    def func(self):
        while self.running:
            self.data += 1
            time.sleep(0.1)


class MyApp(App):

    def build(self):
        self.root = MyLayout()
        return self.root

    def on_stop(self):
        self.root.running = False

MyApp().run()

【讨论】:

以上是关于在 kivy 中非常频繁地运行函数 (Kivy Clock/FreeClock)的主要内容,如果未能解决你的问题,请参考以下文章

加载表单后如何运行函数 Kivy

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

kivy 中的属性绑定和样式问题

带有pycharm导入错误的kivy

来自 kv 按钮的 Kivy 运行功能

Python/Kivy:如何在 ctrl+a 键盘事件上调用函数