我想在kivy中创建一个实时图表。我怎样才能实现这一目标?我是kivy的新手。请帮我。
答案 0 :(得分:8)
kivy garden中有一个图表小部件。您可以在kivy的documentation中阅读有关使用花园小部件的信息。
答案 1 :(得分:4)
我也想在Kivy做一个实时图表。
我开始使用Youscope。您可以在以下YouTube视频https://www.youtube.com/watch?v=-1E0DpQ_cFo
中看到youscope的演示源代码在这里:https://code.google.com/p/felipesanches/source/browse/trunk/youscope-emu/youscope-emu.py
它是用Pygame编写的,并使用波形音频文件作为输入源,但您也可以使用其他来源(例如串行数据或计算曲线)。
Youscope的问题在于我无法从中构建适用于Android的APK。我已经尝试为android安装python子集,但我总是在构建时得到错误消息。 (没弄清楚出了什么问题。)
所以我决定将Youscope代码移植到Kivy,因为使用Buildozer我可以制作Android APK。 (尚未测试构建图形应用程序,但这应该有效。)
绘图似乎与原始代码一样快,但目前我仍然在重绘曲线。但我认为绘图应该更快,也许计算得分太长了。 我想我应该检查一个WAV文件作为输入,如果它更快。
Kivy的源代码与pygame代码非常相似,但在Kivy中没有带有while循环的游戏循环。 在Kivy中,您使用Clock.schedule_intervall(callback,time_in_sec)(请参阅http://kivy.org/docs/api-kivy.clock.html)进行回调以更新/绘制屏幕。
对于绘图,您需要使用添加到画布的帧缓冲区。见http://kivy.org/docs/api-kivy.graphics.fbo.html
曲线从左到右逐点绘制。 通过重绘我的意思是我在帧缓冲区绘制第一条曲线(我使用的是计算出的正弦波),在我到达屏幕的右边缘后,我再次使用新曲线从左侧绘制。
现在仍然需要清除之前绘制的曲线。你可以在这里重绘整个屏幕,但这可能比逐点删除旧行更慢。
这里的困难是恢复旧曲线下面的背景颜色。看起来我得到了错误像素的颜色,但我不确定是什么问题。
使用Framebuffer.get_pixel_color(wx,wy)(需要Kivy 1.8.0),您可以获得rgba中像素的颜色,但这样做不正常。也许这是一个更新问题,但我不确定。
使用黑色像素清除(没有get_pixel_color)正在运行,但会删除背景网格。
答案 2 :(得分:4)
定义你的情节
e.g。
plot = MeshLinePlot(color=next(colors))
定义图表
e.g。
graph = Graph(
xlabel='Iteration',
ylabel='Value',
x_ticks_minor=1,
x_ticks_major=5,
y_ticks_major=1,
y_grid_label=True,
x_grid_label=True,
padding=5,
xlog=False,
ylog=False,
x_grid=True,
y_grid=True,
ymin=0,
ymax=11,
**graph_theme)
更新图表并更新x轴:
e.g。
def update_xaxis(self,*args):
global graph
global cnt
graph.xmin = cnt - 50
graph.xmax = cnt
def update_points(self, *args):
global i
global MYLIST
global cnt
#self.plot.points = [(i,i)]
self.plot.points = [z for z in MYLIST]
拨打时钟
e.g。
Clock.schedule_interval(self.update_points, 1/60.)
Clock.schedule_interval(self.update_xaxis, 1/60.)
并添加小部件:
b.add_widget(graph)
我希望我没有忘记任何事情。它为您提供了与kivy Garden一起运行的图表。