python 动态数据 展示 ,数据是由51单片机发送过来的,温度传感器。

python 复制代码
import tkinter as tk
import random

import serial




lis=[]
for i in range(50):
    lis.append(i+1)
# 打开串行端口
ser = serial.Serial('COM3', 9600)  # 9600为波特率,根据实际情况进行调整


# 初始化数据
lis = [random.randint(15, 35) for _ in range(50)]

def update_data():
    global lis
    # 模拟数据更新
    # lis = [random.randint(15, 35) for _ in range(50)]
    try:   
        if ser.in_waiting > 0:  # 如果串口有数据可读           
            data = ser.read()  # 读取一行数据并解码为字符串
            ser.reset_input_buffer()
            tmp=(ord(data)+100)/10
            print("\r测到的温度是:", tmp,'°C',end=' ')
            lis.append(tmp)
            while len(lis)>50:
                lis.pop(0)
            print(lis,end=' ')
    except Exception as error:
        print(error)
        ser.close()  # 捕获Ctrl+C中断信号后关闭串口    
        print("程序已停止")
        pass

def draw_chart(canvas, data):
    canvas.delete("all")  # 清除画布上的所有内容

    # 以下是绘图代码,与之前相同,只是增加了canvas参数
    margin = 40
    width = 600 - 2 * margin
    height = 400 - 2 * margin
    x_scale = width / (len(data) - 1)
    y_scale = height / (35 - 10)

    canvas.create_line(margin, 400 - margin, 600 - margin, 400 - margin)  # X轴
    canvas.create_line(margin, 400 - margin, margin, margin)  # Y轴

    for i in range(len(data)):
        x = margin + i * x_scale
        if i % 5 == 0:  # 每5个数据点标记一次
            canvas.create_text(x, 400 - margin + 20, text=str(i))

    for value in range(int(10), int(35) + 1, 5):
        y = 400 - margin - (value -10) * y_scale
        canvas.create_line(margin - 5, y, margin, y)
        canvas.create_text(margin - 20, y, text=str(value))

    points=[]
    for i in range(len(data)):
        x = margin + i * x_scale
        y = 400 - margin - (data[i] - 10) * y_scale
        canvas.create_oval(x - 2, y - 2, x + 2, y + 2, fill='red')
        points.append((x,y))
    # 绘制连接线
    for i in range(len(points) - 1):
        canvas.create_line(points[i], points[i+1])

def update_data_and_redraw(canvas):
    update_data()  # 更新数据
    draw_chart(canvas, lis)  # 重绘图表
    root.after(1000, update_data_and_redraw, canvas)  # 每隔1000毫秒(1秒)调用一次该函数

# 创建窗体和画布
root = tk.Tk()
root.title("动态数据展示")
canvas = tk.Canvas(root, width=600, height=400)
canvas.pack()

update_data_and_redraw(canvas)  # 开始数据更新和图形重绘的循环

root.mainloop()
ser.close()  # 捕获Ctrl+C中断信号后关闭串口   
相关推荐
我居然是兔子2 小时前
异常练习:在试错中吃透Java异常处理的底层逻辑
java·开发语言
2501_944452232 小时前
字数统计 Cordova 与 OpenHarmony 混合开发实战
python
养一回月亮!2 小时前
使用Qt实现简单绘图板:鼠标绘制与擦除功能详解
开发语言·qt
骚戴2 小时前
2025 Python AI 实战:零基础调用 LLM API 开发指南
人工智能·python·大模型·llm·api·ai gateway
BanyeBirth2 小时前
C++差分数组(二维)
开发语言·c++·算法
kobe_OKOK_2 小时前
tdeinge REST API 客户端
python·缓存·django
io_T_T2 小时前
Python os库 os.walk使用(详细教程、带实践)
python
Tony Bai2 小时前
Go 的 AI 时代宣言:我们如何用“老”原则,解决“新”问题?
开发语言·人工智能·后端·golang
Fcy6483 小时前
C++ map和multimap的使用
开发语言·c++·stl
L Jiawen3 小时前
【Golang基础】基础知识(下)
服务器·开发语言·golang