import tkinter as tk import paho.mqtt.client as mqtt class App: def __init__(self, root): self.root = root # 将TK()创建的窗口给类成员属性 self.root.title("坐标发布订阅") # 修改GUI题目 self.canvas = tk.Canvas(self.root, width=400, height=400) # 确定窗口的大小 self.canvas.pack() self.start_button = tk.Button(self.root, text="开始任务", command=self.start_publishing) # 发布信息 self.start_button.pack() # 将画布添加到界面窗口之内,使用默认的布局管理器 self.x = 0.0 # 初始化坐标 self.y = 0.0 self.client = mqtt.Client() # 创建一个MQTT客户端对象 -- 与MQTT代理服务器进行通信,可进行发布订阅信息 # 在连接成功后将回调函数self.on_connect成功调用 self.client.on_connect = self.on_connect # 订阅到话题的信息之后就调用回调函数self.on_message对数据进行处理 self.client.on_message = self.on_message self.client.connect("broker.emqx.io", 1883, 60) self.client.loop_start() def start_publishing(self): # 在这里添加逻辑以生成并发布坐标信息 self.x += 0.5 self.y += 0.5 self.client.publish("coordinates", f"{self.x},{self.y}") def on_connect(self, client, userdata, flags, rc): print("Connected with result code "+str(rc)) # 查看是否连接mqtt服务器成功 client.subscribe("coordinates") # 订阅了主体名为coordinates的信息 def on_message(self, client, userdata, msg): # msg.topic -- 消息的主题名称 msg.payload.decode("utf-8")--消息内容 print(msg.topic+" "+msg.payload.decode("utf-8")) coordinates = msg.payload.decode("utf-8").split(",") # 将信息转换为列表信息 # print("coordinates = ", coordinates) # print("typr of coordinates = ", type(coordinates)) self.update_coordinates(float(coordinates[0]), float(coordinates[1])) def update_coordinates(self, x, y): # 将传入的信息更新坐标位置 self.x = x self.y = y self.draw_coordinates() # def draw_coordinates(self): # 更新坐标的函数 self.canvas.delete("coordinate") # 删除画布上coordinate标签的坐标点,以便于更新坐标 # 200是偏移量 50为缩放因子 x_pixel = 200 + self.x * 50 # 根据需要进行缩放和偏移 y_pixel = 200 - self.y * 50 # 根据需要进行缩放和偏移 self.canvas.create_oval(x_pixel - 5, y_pixel - 5, x_pixel + 5, y_pixel + 5, fill="red", tags="coordinate") root = tk.Tk() # 使用TK()创建一个主窗口 app = App(root) # 实例化一个对象 root.mainloop()
pyton实现GUI+发布订阅
最新推荐文章于 2024-07-28 15:46:11 发布