- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是一个糟糕的程序员所以请原谅我的简单问题。我正在尝试构建一个从串行接口(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/
所以我有这个 javascript 片段,它有两个按钮可以进入全屏,一个按钮可以退出全屏。我想做到这一点,如果我不在全屏模式下,按钮会显示转到全屏模式,而当我处于全屏模式时,按钮会显示退出全屏模式..
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我尝试将 Twitter 上的“Tweet Me”按钮 ( http://twitter.com/goodies/tweetbutton ) 添加到我的网站。然而,每当按下按钮时,我都会收到此 Jav
我试图在我的文本区域中获取一个按钮值,如果我使用 则工作正常但如果我使用那么它就不起作用了。你能找出问题所在吗? HTML 1 2 3 4 JavaScript $(document).read
我的 C# Winform 面板中有一堆文本框。每行文本框的命名如下: tb1 tbNickName1 comboBox1 tb2 tbNickName2 comboBox2 tb3 tbNickNa
我有一个表单,其中过滤器下方有按钮(应用过滤器和清除过滤器),我试图在单击“应用”按钮时显示“清除”,并在单击“清除”按钮时隐藏“清除”按钮。 下面的代码(如果我的表有的话):
excel 按钮正在工作,但是当我添加 pdf 按钮时,它添加仅显示 pdf 按钮 excel 按钮在 pdf 按钮添加后隐藏 $(document).ready(function() { $
我想创建一个 div 作为标题并分成 3 列,并按以下顺序在其中放置 2 个按钮和一个标题:Button1(左位) Title(居中) Button2(右位) 这是我为这个 div 编写的代码:
仅当选中所有框时才应禁用“允许”按钮。我该怎么做?我已经完成了 HTML 部分,如下所示。如何执行其中的逻辑部分?即使未选中一个复选框,也应禁用“允许”按钮
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如您所知,您可以使用 2 种方法在 HTML5 中呈现按钮: 使用 void 元素 或 如果您需要内容,请使用 元素(不是空元素)。 在JSF2中,有2种方式生成按钮;与UICommand或 UIOu
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我有用于在消息(电子邮件、短信)上输入内容的 EditText。我希望在单击 ActionDone 按钮时立即发布消息。我为此使用以下代码: message.setOnEditorActionList
我的 Android 应用程序中有一堆 EditText,每个都将 InputMethod 设置为 numberSigned。我的目标设备没有硬件键盘,而是使用软件键盘输入数字。 Android 将输
我无法以编程方式隐藏弧形菜单中的 fab 按钮。我正在使用https://github.com/saurabharora90/MaterialArcMenu在我的代码中。如何在Java中以编程方式隐藏
我已经看到这在其他类型的对话框窗口中是可能的,例如“showConfirmDialog”,其中可以指定按钮的数量及其名称;但是使用“showInputDialog”时是否可以实现相同的功能?我似乎无法
相同的按钮用于激活和停用。第一次,当代码运行按钮单击并成功“停用”时。但第二次,代码无法找到该元素。第一个案例按钮位于第二个“a”标签中,然后停用第一个“a”标签中的按钮。 案例1: Edit
是否可以将按钮的 onclick 操作设置为 JavaScript 变量?这个想法是我们用 JavaScript 控制一个表。每当点击该表的一行时,我们就会更新一个 JavaScript 变量。该 v
我想创建一个按钮,它包含左侧的文本和右侧的复选框(或任何其他组件)。我怎样才能做到这一点? 我发现我可以制作自己的 View extends Button,但是如果可以的话我应该如何实现 onDraw
我是一名优秀的程序员,十分优秀!