【问题标题】:Pass Variables from MQTT to Kivy将变量从 MQTT 传递到 Kivy
【发布时间】:2018-09-23 11:12:12
【问题描述】:

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

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

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":
                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()

mainmenu.kv

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

【问题讨论】:

  • 什么是toggle_state?请提供minimal reproducible example
  • 点击button2,左侧弹出导航菜单。
  • 我从帖子中删除了不必要的部分。
  • 你能接受答案吗?

标签: python kivy navigation-drawer mqtt kivy-language


【解决方案1】:

您可以像这样将“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()

【讨论】:

    【解决方案2】:

    认为您的问题中缺少.root 对应的userdata['self']

    至少对我来说,当我进行以下更改时它起作用了。

    替换

    userdata['self'].vartext2 = msg.payload 
    

    userdata['self'].root.vartext2 = msg.payload
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 2011-11-14
      • 2017-06-03
      • 2013-06-10
      • 2020-02-25
      • 2021-09-12
      • 2013-07-17
      相关资源
      最近更新 更多