python绘制好几个子图_如何使用Python和Tkinter实时更新多个子图

我正在制作一个Python GUI,以取代我使用Arduino制作接口的旧的Matlab GUI。我需要GUI能够以每秒20点的速度绘制传入的arduino数据,而不会减慢速度,我只需要它绘制最近的100点。我一直在遇到很多麻烦,并希望我能够在如何做到这一点上得到一些帮助。我还没有很好的使用Python,所以我提前道歉,没有最pythonic代码和不完全理解事物。这是我迄今为止所拥有的。 (我需要能够操纵GUI上的按钮,而它在运行的情况下,我需要停下来等等)如何使用Python和Tkinter实时更新多个子图

import Tkinter

import numpy as np

import serial

import time

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

from matplotlib.figure import Figure

from math import sin

class App:

def __init__(self, master):

frame = Tkinter.Frame(master)

self.Max_press = Tkinter.StringVar()

self.Max_press.set("10")

self.Min_press = Tkinter.StringVar()

self.Min_press.set("0")

self.Cycle_per_minute = Tkinter.StringVar()

self.Cycle_per_minute.set("12")

self.Duration_cycle = Tkinter.StringVar()

self.Duration_cycle.set("1")

self.respiration = Tkinter.LabelFrame(frame, text="Respiration Testing", borderwidth=10, relief=Tkinter.GROOVE, padx=10, pady=10)

self.respiration.grid(row=0, column=0, padx=20, pady=20)

self.max_pressure = Tkinter.Label(self.respiration, text="Maximum Pressure (mmHg)")

self.max_pressure.grid(row=0, column=0, padx=5, pady=5)

self.Max_pressure = Tkinter.Entry(self.respiration,textvariable=self.Max_press)

self.Max_pressure.grid(row=1, column=0, padx=5, pady=5)

self.min_pressure = Tkinter.Label(self.respiration, text="Minimum Pressure (mmHg)")

self.min_pressure.grid(row=2, column=0, padx=5, pady=5)

self.Min_pressure = Tkinter.Entry(self.respiration, textvariable=self.Min_press)

self.Min_pressure.grid(row=3, column=0, padx=5, pady=5)

self.cycles_per_minute = Tkinter.Label(self.respiration, text="Cycles Per Minute")

self.cycles_per_minute.grid(row=4, column=0, padx=5, pady=5)

self.Cycles_per_minute = Tkinter.Entry(self.respiration,textvariable=self.Cycle_per_minute)

self.Cycles_per_minute.grid(row=5, column=0, padx=5, pady=5)

self.duration_of_test = Tkinter.Label(self.respiration, text="Duration (minutes)")

self.duration_of_test.grid(row=6, column=0, padx=5, pady=5)

self.Duration_of_test = Tkinter.Entry(self.respiration, textvariable=self.Duration_cycle)

self.Duration_of_test.grid(row=7, column=0, padx=5, pady=5)

self.run_respiration = Tkinter.Button(self.respiration, text="RUN RESPIRATION", command=self.getData)

self.run_respiration.grid(row=8, column=0, padx=5, pady=5)

self.burst = Tkinter.LabelFrame(frame, text="Burst Test", borderwidth=10, relief=Tkinter.GROOVE, padx=10, pady=10)

self.burst.grid(row=0, column=1, padx=20, pady=20)

self.burst_pressure = Tkinter.Button(self.burst, text="RUN BURST TEST")

self.burst_pressure.grid(row=0, column=0, padx=5, pady=5)

self.test_options = Tkinter.LabelFrame(frame, text="Test Options", borderwidth=10, relief=Tkinter.GROOVE, padx=10, pady=10)

self.test_options.grid(row=0, column=2, padx=20, pady=35)

self.stop = Tkinter.Button(self.test_options, text="STOP", bd=10, height=5, width=10)

self.stop.grid(row=0, column=0, padx=10, pady=25)

self.pause = Tkinter.Button(self.test_options, text="PAUSE", bd=10, height=5, width=10)

self.pause.grid(row=1, column=0, padx=10, pady=25)

self.reset = Tkinter.Button(self.test_options, text="RESET", bd=10, height=5, width=10)

self.reset.grid(row=2, column=0, padx=10, pady=25)

self.save = Tkinter.Button(self.test_options, text="SAVE", bd=10, height=5, width=10)

self.save.grid(row=3, column=0, padx=10, pady=25)

fig = Figure()

ax = fig.add_subplot(211)

fig1 = Figure()

ax1 = fig1.add_subplot(212)

self.line, = ax.plot([x/0.5 for x in range(20)])

self.line, = ax1.plot([x/1 for x in range(20)])

self.canvas = FigureCanvasTkAgg(fig,master=master)

self.canvas.show()

self.canvas = FigureCanvasTkAgg(fig1,master=master)

self.canvas.show()

self.canvas.get_tk_widget().grid(row=0, column=3, padx=20, pady=20)

frame.grid(row=0, column=0, padx=20, pady=20)

def getData(self):

press_max = float(self.Max_press.get())

press_min = float(self.Min_press.get())

duration = float(self.Duration_cycle.get())*60*20

cycle_time = float(self.Cycles_per_minute.get())

self.makeSine(press_max, press_min, duration, cycle_time)

def makeSine(self, Press_max, Press_min, Duration, Cycle_time):

i = 0

x = []

y = []

amp = (Press_max - Press_min)/2

offset = amp + Press_min

spb = 60/Cycle_time

while (i < Duration + 1):

x.append(i)

sine = amp*np.sin((x[i]*(np.pi*4))/(2*spb)) + offset + 1

y.append(sine)

i = i + 1

self.readWrite(x,y, Duration)

def readWrite(self, x, y, Duration):

i = 0

arduinoData = serial.Serial('com5', 115200)

arduinoData.flushInput()

start = time.time()

while (i < Duration + 1): # While loop that loops forever

while (arduinoData.inWaiting()==0):

pass

arduinoString = arduinoData.readline()

dataArray = arduinoString #.split(',')

#temp = int(dataArray[0])

temp = int(dataArray)

#P = int(dataArray[1])

print temp #, P

i = i + 1

end = time.time()

print (end - start)

root = Tkinter.Tk()

app = App(root)

root.mainloop()

2017-04-12

emg184

+0

【如何更新FigureCanvasTkAgg内容](http://stackoverflow.com/questions/12124350/how-to-update-the-contents-of-a-figurecanvastkagg) –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
可以使用`after`方法来实现定时更新`ax.fill_between`区域。具体步骤如下: 1. 创建一个`FigureCanvasTkAgg`对象,并将其放置在Tkinter窗口中。 2. 创建一个matplotlib的figure对象,然后在其中添加一个`Axes`对象。 3. 在`Axes`对象中使用`fill_between`方法绘制区域。 4. 使用`after`方法定时更新`fill_between`区域,更新后需要重新绘制整个图形。 下面是一个简单的示例代码,可以实现每秒钟更新一次`fill_between`区域: ```python import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure import numpy as np # 创建Tkinter窗口 root = tk.Tk() root.geometry('500x500') # 创建Matplotlib图形 fig = Figure(figsize=(5, 5)) ax = fig.add_subplot(111) # 绘制填充区域 x = np.linspace(0, 10, 100) y1 = np.sin(x) y2 = np.cos(x) line1, = ax.plot(x, y1, 'b') line2, = ax.plot(x, y2, 'r') fill = ax.fill_between(x, y1, y2, alpha=0.5) # 将Matplotlib图形添加到Tkinter窗口中 canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().pack() # 定义更新函数 def update(): # 更新数据 y1 = np.sin(x + update.count) y2 = np.cos(x + update.count) fill.remove() fill = ax.fill_between(x, y1, y2, alpha=0.5) update.count += 0.1 # 重新绘制图形 canvas.draw() # 使用after方法定时更新 root.after(1000, update) update.count = 0 update() root.mainloop() ``` 在这个示例中,我们使用`update`函数来定时更新`fill_between`区域。每次更新时,我们通过修改数据和重新绘制图形来实现更新使用`after`方法可以让我们实现定时更新,同时不会阻塞GUI线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值