Как позиционировать бесконечные циклы для tkinter и paho-mqtt-client? - PullRequest
1 голос
/ 12 февраля 2020

Это мой код

import paho.mqtt.client as mqtt
import json
from tkinter import *
from tkmacosx import *

class App:
    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="QUIT", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print("hi there, everyone!")

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("$SYS/broker/clients/connected")

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    print(data)

root = Tk()

client = mqtt.Client()
app = App(root)
root.mainloop()

client.on_connect = on_connect
client.on_message = on_message

client.connect("test.mosquitto.org", 1883, 60)
client.loop_forever()

Не беспокойтесь о том, что он делает сейчас. Что мне нужно понять, так это концепция бесконечных циклов.

Мне нужен бесконечный l oop, чтобы окно tkinter оставалось на экране. Мне также нужен бесконечный l oop, чтобы поддерживать соединение с клиентом MQTT.

Как мне расположить эти бесконечные циклы в моем коде? Если я помещаю root .mainl oop () перед client.loopforever (), я получаю код MQTT только когда закрываю окно tkinter. Если я помещаю root .mainl oop () после client.loopforever (), то при закрытии соединения MQTT открывается окно tkinter.

Идея состоит в том, чтобы получить сообщения от брокера и показать их в окне tkinter. Пожалуйста, помогите мне понять, где расположить эти две бесконечные петли.

1 Ответ

0 голосов
/ 12 февраля 2020

Если событие l oop уже существует, то loop_forever() не следует использовать, но loop_start():

# ...
root = Tk()

client = mqtt.Client()

client.on_connect = on_connect
client.on_message = on_message

client.connect("test.mosquitto.org", 1883, 60)
<b>client.loop_start()</b>

app = App(root)
root.mainloop()
...