gpt4 book ai didi

Python Matplotlib 按钮

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:06 24 4
gpt4 key购买 nike

我是一个糟糕的程序员所以请原谅我的简单问题。我正在尝试构建一个从串行接口(interface)读取数据并将其显示在屏幕上的小程序。我已经能够在 iPython notebook 和 matplotlib 中做到这一点,并且我已经能够在屏幕上添加按钮来控制进入界面的数据请求:按钮点击 -> ser.write, ser.read, draw

我现在正在努力设计程序,以便按下一个按钮将开始以固定的时间步长重复收集数据,直到再次关闭该按钮。有人可以帮我画出这样一个程序的草图吗?

到目前为止:

%pylab 

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Button

import serial
import binascii
import struct
from time import sleep

fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
ax.axis([0, 10, 0, 255])

ser = serial.Serial('COM5', 1000000, timeout=0)
ser.write("0".encode())
sleep(0.1)
if ser.read()== b'\xf1':
print ("Interface is responding")
else:
print ("Interface is NOT responding")
ser.flush()
ser.close()
exit(1)

t = np.linspace(0, 10, 2048)
line1, line2 = plt.plot(t,0*t, t,0*t, lw=2)

def ShowChannel(Channel):
if Channel==1:
ser.write("11".encode())
elif Channel==2:
ser.write("12".encode())
sleep(0.05)
Header = ser.read().decode("utf-8")
# print(Header)
if Header == "1":
data = ser.read(2048)
y = struct.unpack('2048B', data)
# print(y)
if Channel==1:
line1.set_ydata(y)
elif Channel==2:
line2.set_ydata(y)
fig.canvas.draw()

def one(event):
ShowChannel(1)

def two(event):
ShowChannel(2)

axone = plt.axes([0.1, 0.05, 0.1, 0.075])
axtwo = plt.axes([0.21, 0.05, 0.1, 0.075])
axstart = plt.axes([0.40, 0.05, 0.1, 0.075])
axstop = plt.axes([0.51, 0.05, 0.1, 0.075])

bone = Button(axone, '1')
bone.on_clicked(one)
btwo = Button(axtwo, '2')
btwo.on_clicked(two)

按照评论中引用的示例,我添加了以下内容

# Build check button axes
rax = plt.axes([0.7, 0.05, 0.1, 0.1], aspect='equal')
labels = ('go!',)
check = CheckButtons(rax, labels, (False, ))

KeepShowing = False

def func(event):
global KeepShowing
KeepShowing = not KeepShowing
# print(event, KeepShowing)

check.on_clicked(func)

while True:
if KeepShowing:
ShowChannel(1)
sleep(1)

但是最下面的循环不是怎么做的。当我用它启动程序时,图形窗口打开,但没有显示任何内容。只有当我在 ipython 中中断内核时,屏幕才会构建。

最佳答案

如果要定时调用读取数据的函数,可以使用matplotlib模块中的timer。代码如下:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
timer = fig.canvas.new_timer(interval)
timer.add_callback(function, args)

时间间隔的单位是ms,可以使用timer.start()timer.stop()方法开启或关闭定时器.


根据您的代码,我为每个按钮添加了计时器,并添加了变量来检查计时器是否正在运行:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Button

import serial
import binascii
import struct
from time import sleep

fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
ax.axis([0, 10, 0, 255])

ser = serial.Serial('COM5', 1000000, timeout=0)
ser.write("0".encode())
sleep(0.1)
if ser.read()== b'\xf1':
print ("Interface is responding")
else:
print ("Interface is NOT responding")
ser.flush()
ser.close()
exit(1)

t = np.linspace(0, 10, 2048)
line1, line2 = plt.plot(t,0*t, t,0*t, lw=2)

def ShowChannel(Channel):
if Channel==1:
ser.write("11".encode())
elif Channel==2:
ser.write("12".encode())
sleep(0.05)
Header = ser.read().decode("utf-8")
# print(Header)
if Header == "1":
data = ser.read(2048)
y = struct.unpack('2048B', data)
# print(y)
if Channel==1:
line1.set_ydata(y)
elif Channel==2:
line2.set_ydata(y)
fig.canvas.draw()

def one(event):
global channel1_on

if channel1_on == 0:
channel1_on = 1
timer1.start()
else:
channel1_on = 0
timer1.stop()
line1.set_ydata(None)

def two(event):
global channel2_on

if channel2_on == 0:
channel2_on = 1
timer2.start()
else:
channel2_on = 0
timer2.stop()
line2.set_ydata(None)

channel1_on = 0
channel2_on = 0
timer1 = fig.canvas.new_timer(interval = 50)
timer1.add_callback(ShowChannel, 1)
timer2 = fig.canvas.new_timer(interval = 50)
timer2.add_callback(ShowChannel, 2)

axone = plt.axes([0.1, 0.05, 0.1, 0.075])
axtwo = plt.axes([0.21, 0.05, 0.1, 0.075])
axstart = plt.axes([0.40, 0.05, 0.1, 0.075])
axstop = plt.axes([0.51, 0.05, 0.1, 0.075])

bone = Button(axone, '1')
bone.on_clicked(one)
btwo = Button(axtwo, '2')
btwo.on_clicked(two)

plt.show()

另一件事是,如果我没有在您的代码中添加 plt.show() 行,它在我的计算机中运行时不会显示图形。所以我把它添加到你的代码的末尾,它现在可以显示这个数字了。

希望对您有所帮助。

关于Python Matplotlib 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com