Kivy - текст метки не обновляется (всегда) - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблема с динамическим обновлением текста моего ярлыка.

Я делаю физическое записывающее устройство, используя Raspberry pi, и моя цель - отслеживать состояние моего рекордера (Запись / Not Recording) путем обновления метки.

Программа работает следующим образом: Проверьте, нажата ли кнопка -> Запись -> Проверьте, нажата кнопка -> Остановить запись

Мне удается успешно обновить метку только при нет другие функции вызваны после self.ids.lab.text оператор:

Обновление успешно

if self.Buttpress() == 0:
            self.ids.lab.text = "Pressed"         

Не обновляется успешно

if self.Buttpress() == 0:
            self.ids.lab.text = "Pressed"
            self.assign_action()         

Вот код разбивки:

#test_kivy.py 

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD) # Setting pin board pin mode
global pin
pin = 10 #Button pin
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Sets raspi internal resistors to pull-up


class Test(Screen):

    # Counter Keeping track of recording state
    rec = 0

    def __init__(self, **kwargs):
        super(Test, self).__init__(**kwargs)

        # Scheduling the start of the program, giving time to the GUI to initialise
        Clock.schedule_once(self.mathere isin, 4)


    # Assigning the state of my button        
    def Buttpress(self):
        buttpress = GPIO.input(pin)
        return buttpress

    # Checking if button is pressed (1 = not pressed, 0 = pressed)   
    def button_state(self):
        while self.Buttpress() == 1:
            self.Buttpress()

        if self.Buttpress() == 0:

            # updating label when pressed
            self.ids.lab.text = "Pressed"
            self.assign_action()

    def assign_action(self):
        if self.rec == 0:
            print("Recording")
            # updating label to Recording...
            self.ids.lab.text = "Recording..."
            self.rec = self.rec+1

            #Debounce time
            time.sleep(1)
            self.button_state()

        if self.rec == 1:
            print("Not rec")
            # updating label to Recording...
            self.ids.lab.text = "Recording Stop"
            #Updating recording state
            self.rec = self.rec-1

            #Debounce time
            time.sleep(1)
            self.button_state()

    def main(self,dt):
        self.button_state()



class WindowManager(ScreenManager):code
    pass


class TestGui(App):
    def build(self):
        self.load_kv('test_kivy.kv')
        return Test()



if __name__ == "__main__":
    TestGui().run()

И мой файл .kv:

#text_kivy.kv

<CustLabel@Label>:
    font_size: 26
    color: (0.3,0.5,0.9,1)
    size_hint: (0.2, 0.1)
    background_color: (0.3,0.5,0.6,1)

<Test>:
    size: root.width, root.height
    id: main_menu

    FloatLayout:     
        CustLabel:
            id : lab
            text: "Not Pressed"
            pos_hint: {"x":0.39,"top":1}

Я потратил 3 дня, пытаясь успешно обновить ярлык, используя идентификаторы , ObjectProperty , App.get_running_app () и другие.

Я относительно новый Kivy, поэтому надеюсь, что над ним не так много мусора.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 28 апреля 2020

Ваша проблема не в обновлении текста метки, а в остальном коде, который блокирует gui, поэтому он не может обновиться. Когда вы пишете time.sleep, это именно то, что происходит, программа ничего не делает, включая обновление того, что нарисовано на экране.

Возможны следующие варианты:

1) Используйте Clock.schedule_once для запланируйте функцию, которая заканчивает запись, вместо time.sleep. В данном случае это простой вариант.

2) Делайте записи в потоке

...