Kivy Gui отстает от малины после использования таймера - PullRequest
0 голосов
/ 05 апреля 2019

Я использую kivy 1.10.1 с python 3.4.2 на моем raspberry pi 3, и графический интерфейс с некоторыми кнопками и надписями работает нормально.Теперь я хочу обновлять графический интерфейс каждую секунду, чтобы показать некоторые новые данные (обновить часы, получить некоторые значения из базы данных и т. Д.)

Проблема:

Когда я запускаю таймер, графический интерфейсстановится очень медленным.Я протестировал некоторые модификации кода, такие как отключение чтения данных, но без какого-либо эффекта.Каждый раз, когда вызывается таймер, графический интерфейс отстает на несколько миллисекунд.

Кто-нибудь знает, в чем причина?Я уверен, что аппаратное обеспечение моего Raspberry не является проблемой, потому что, когда я использую примеры KIVY (например, с некоторыми 3D-рендеринга), все работает без каких-либо задержек.

Детали Kivy:

 [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

Фрагмент кода:

 # 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, но она мне не помогла.

С уважением!

1 Ответ

0 голосов
/ 07 апреля 2019

Я нашел решение.Если просто обновить элементы графического интерфейса с помощью «schedule_interval (...)», все работает нормально.Задержка происходит, если я пытаюсь получить измеренные значения через «schedule_interval (...)».Я изменил получаемые значения в отдельный поток с помощью:

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

Теперь я могу отображать измеренные значения в графическом интерфейсе без задержки!

...