Я не могу обновить содержимое метки Kivy из Python

Я заявляю, что это первый раз, когда я использую Kivy. Код, который я приложил, работает, единственная проблема в том, что метка lbl не обновляется автоматически, а только если я нажимаю кнопку update. На практике, если я вызываю функцию update_lbl с помощью кнопки «обновить», она работает, когда она вызывается автоматически с помощью unpacking_msg, она ничего не делает.

from email import message
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivy.lang import Builder
from numpy import empty
import paho.mqtt.client as mqttClient
from queue import Queue
import threading

q=Queue()
incoming_message =''
incoming_topic =''

class Manager(ScreenManager):
    pass

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

class HomeScreen(Screen):

    pass

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

class MsgDecoder ():
    
    def __init__(self,msg):
        self.msg = msg
    
    def unpacking_msg(self):
        global incoming_message
        global incoming_topic
        incoming_topic =  str(self.msg.topic)
        incoming_message = str(self.msg.payload.decode("utf-8"))
        MainApp().update_lbl()
        
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

class MqttApp():

    def __init__(self,broker_address,port,user,password):   
        self.password = password
        self.user = user
        self.port = port
        self.broker_address = broker_address
       
    broker_address = "broker.hivemq.com"    
    port = 1883                   
    user = ""                  
    password = ""   

    try:
        client = mqttClient.Client(clean_session=True, userdata=True)               
        client.username_pw_set(user , password) 
        client.connect(broker_address,port)
        client.loop_start() 
    except:
        pass
        
    def on_connect(client, userdata, flags, rc):
        client.subscribe("kivy")

    def on_message(client, userdata, msg):
        q.put(msg)        
                    
    client.on_connect = on_connect
    client.on_message = on_message

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

class MainApp(App):  
    
    lbl_txt = StringProperty()

    def __init__(self):
            super(MainApp, self).__init__()
            self.lbl_txt = ("No message")
    
    def switch_callback(self, switchObject, switchValue):
        
        if(switchValue):
            MqttApp.client.publish("kivy", "ON")
        else:
            MqttApp.client.publish("kivy", "OFF") 

    def update_lbl(self, *args):
        self.lbl_txt=incoming_message 

 #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

def get_msg ():
    threading.Timer(1.0, get_msg).start()
    while not q.empty():
        msg = q.get()
        if msg is None:
            continue
        md= MsgDecoder(msg)
        md.unpacking_msg()
get_msg()

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

Вот файл Киви:

ScreenManager:
    HomeScreen:
        id: 'homescreen'
        
    
<HomeScreen>:
    swc: swc
    
    BoxLayout:
       

        orientation: 'vertical'
        spacing: 50
        padding: 100

        Label:
            text: 'Remote Lamp'

        Switch:
            id:swc
            on_active: app.switch_callback(*args)

        Button:
            text: "update"
            on_press: app.update_lbl()    

        Label:
            id: lbl
            text: app.lbl_txt

Я очень ценю любые другие полезные советы! Я не специалист, как видите.

Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
16
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что ваш код:

MainApp().update_lbl()

создает новый экземпляр MainApp и вызывает его метод update)lbl(). Однако этот новый экземпляр MainApp — это не тот экземпляр, который вы видите на экране. Вы должны вызвать метод update_lbl() запущенного App. Вы можете сделать это, используя метод get_running_app(). См. документация. Попробуйте эту замену для приведенной выше строки:

App.get_running_app().update_lbl()

Большое спасибо, я догадался, в чем проблема, но я не знал, как ее решить. В настоящее время работает.

Christian 10.04.2022 14:36

Дайте мне знать, что еще вы бы изменили.

Christian 10.04.2022 14:37

Другие вопросы по теме