python - 将变量从 MQTT 传递给 Kivy

标签 python kivy navigation-drawer mqtt kivy-language

我尝试使用抽屉导航将值从 MQTT 传递到 Kivy 仪表板。

有人可以提示我如何更改变量吗?
这是我的示例代码。 MQTT 正在运行。
我使用 Python 3.6.6 和 1.10.1。

主菜单.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.garden.navigationdrawer import NavigationDrawer
from kivy.properties import StringProperty
import paho.mqtt.client as mqtt

class Drawer(NavigationDrawer):
    vartext1 = StringProperty("Button")
    vartext2 = StringProperty("Text")

class MainMenuApp(App):
    def build(self):
        return Drawer()

    def on_start(self):
        topic = "kivy/#"

        def onConnect(client, userdata, flags, rc):
            mqttc.subscribe(topic, 0)

        def onMessage(client, userdata, msg):
            msg.payload = msg.payload.decode("utf-8")
            print ("[INFO   ] [MQTT        ] topic: " + msg.topic +" msg: "+ msg.payload)
            if msg.topic == "kivy/button":
                vartext1 = msg.payload

            if msg.topic == "kivy/text":
                vartext2 = msg.payload

        mqttc = mqtt.Client(client_id="kivy-client", clean_session=True)
        mqttc.on_connect      = onConnect 
        mqttc.on_message      = onMessage
        mqttc.connect("10.0.0.104", 1883, keepalive=60, bind_address="")
        mqttc.loop_start() # start loop to process callbacks! (new thread!)

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

主菜单.kv
<Drawer>:
    # Side panel
    BoxLayout:
        padding: 30
        Button:
            text: root.vartext1
    # Main panel
    BoxLayout:
        padding: 30
        Label:
            text: root.vartext2

最佳答案

您可以像这样将“self”参数传递给 mqtt.Client 构造函数:

parameters = {'self': self}
mqttc = mqtt.Client(client_id="kivy-client", clean_session=True, userdata = parameters)

现在在 onMessage 过程中,您可以访问该参数:
userdata['self'].vartext1 = msg.payload

所以你的 mainmenu.py 文件应该是这样的:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.garden.navigationdrawer import NavigationDrawer
from kivy.properties import StringProperty
import paho.mqtt.client as mqtt

class Drawer(NavigationDrawer):
    vartext1 = StringProperty("Button")
    vartext2 = StringProperty("Text")

class MainMenuApp(App):
    def build(self):
        return Drawer()

    def on_start(self):
        topic = "kivy/#"

        def onConnect(client, userdata, flags, rc):
            mqttc.subscribe(topic, 0)

        def onMessage(client, userdata, msg):
            msg.payload = msg.payload.decode("utf-8")
            print ("[INFO   ] [MQTT        ] topic: " + msg.topic +" msg: "+ msg.payload)
            if msg.topic == "kivy/button":
                userdata['self'].vartext1 = msg.payload

            if msg.topic == "kivy/text":
                userdata['self'].vartext2 = msg.payload

        parameters = {'self': self}
        mqttc = mqtt.Client(client_id="kivy-client", clean_session=True, userdata = parameters)
        mqttc.on_connect      = onConnect 
        mqttc.on_message      = onMessage
        mqttc.connect("10.0.0.104", 1883, keepalive=60, bind_address="")
        mqttc.loop_start() # start loop to process callbacks! (new thread!)

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

关于python - 将变量从 MQTT 传递给 Kivy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52465547/

相关文章:

python - 在 Python 中按键对字典列表进行排序

python - Kivy:在 python 中添加的小部件中获取父级

android - 在Navigation-Drawer的抽屉中加载自定义fragment,并在主布局中打开对应的fragment

android - 像 Android 5.0 一样在 ActionBar/StatusBar 顶部的抽屉导航而不使用 AppCompact/ToolBar

android - 显示箭头而不是 Material 设计版本的汉堡图标。为什么 onPostCreate 中的syncState不起作用?

python - 如何在循环外使用循环计数

Python 减去 Python Dataframe 的累积列

python - Kivy:如何在Python中实例化动态类

android - kivy:水平ListView

python - 在什么时候导入成为正确的解决方案?