【问题标题】:Kivy gui lags on raspberry after using timer使用计时器后,Kivy gui 滞后于覆盆子
【发布时间】:2019-04-05 16:17:18
【问题描述】:

我在我的树莓派 3 上使用 kivy 1.10.1 和 python 3.4.2,带有一些按钮和标签的 GUI 工作正常。现在我想每秒更新一次 GUI 以显示一些新数据(更新时钟,从数据库中获取一些值等)

问题:

当我启动计时器时,GUI 变得非常慢。我测试了代码的一些修改,比如禁用数据读取,但没有任何效果。每次调用计时器时,GUI 都会滞后几毫秒。

有人知道这是什么原因吗?我确信我的树莓派的硬件不是问题,因为当我使用 kivy 示例(例如,使用一些 3D 渲染)时,一切正常,没有任何延迟。

基维详情:

 [INFO   ] [Kivy        ] v1.10.1
 [INFO   ] [Python      ] v3.4.2 (default, Oct 19 2014, 13:31:11) 
 [GCC 4.9.1]
 [INFO   ] [Factory     ] 194 symbols loaded
 [INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil,                img_gif (img_ffpyplayer ignored)
 [INFO   ] [Window      ] Provider: egl_rpi
 [INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
 [INFO   ] [GL          ] Backend used <gl>
 [INFO   ] [GL          ] OpenGL version <b'OpenGL ES 2.0'>
 [INFO   ] [GL          ] OpenGL vendor <b'Broadcom'>
 [INFO   ] [GL          ] OpenGL renderer <b'VideoCore IV HW'>
 [INFO   ] [GL          ] OpenGL parsed version: 2, 0
 [INFO   ] [GL          ] Shading version <b'OpenGL ES GLSL ES 1.00'>
 [INFO   ] [GL          ] Texture max size <2048>
 [INFO   ] [GL          ] Texture max units <8>
 [INFO   ] [Window      ] virtual keyboard allowed, multiuser mode, not docked
 [INFO   ] [Text        ] Provider: sdl2
 [INFO   ] [KivyMD      ] KivyMD version: 0.1.2

代码sn-p:

 # Start timer in a separated thread
 def start_timer_gui(self):
    try:
        # Test connection
        if s_conn.test_serial(self) == True:
            th = threading.Thread(target=self.thread_timer_gui,
                                  args=())
            th.start()

...


# Start timer (is in a separated thread)
def thread_timer_gui(self):
    Clock.schedule_interval(partial(self.thread_timer_gui_methods), 1)

@timeit
# Call functions for updating gui from separated thread
def thread_timer_gui_methods(self, dt=0):
    self.update_gui()
    #self.get_measured_vales()

def update_gui(self):
    self.emcstatebar.lbl_local_time.text = "13-03-2019 07:32"
...

我已经阅读了此页面 https://kivy.org/doc/stable/guide/events.html 的信息,但这对我没有帮助。

最好的问候!

【问题讨论】:

  • 不确定这是否是问题所在,但您无需在 start_timer_gui() 方法中启动新线程。您可以在start_timer_gui() 中执行Clock.schedule_interval()。此外,@timeit 装饰器会导致一些延迟。
  • 我尝试了你的建议,但没有任何改变:-(

标签: python-3.x kivy raspberry-pi3


【解决方案1】:

我找到了解决方案。如果只是使用“schedule_interval(...)”更新 GUI 元素,一切正常。如果我尝试通过“schedule_interval(...)”获取测量值,则会出现滞后。我将获取值更改为单独的线程:

 # Get measured values in a separated thread)
 def thread_timer_values(self):
     while True:
         self.get_measured_vales()
         time.sleep(2)

现在我可以毫无延迟地在 GUI 中显示测量值!

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多