带有MeshLinePlot混淆的Python Kivy图

时间:2018-09-06 09:23:47

标签: python plot kivy kivy-language

我正在尝试为Kivy应用程序实现测量的实时绘图,但是我不了解Kivy Garden库的内部工作原理。

我要实现的目标:我想在ScrollView中包含多个图,以便可以从字典中以编程方式添加多个实时图,并在它们之间滚动浏览占据一个屏幕高度以上的空间。我的主要问题是,Graph的行为不像普通的Widget,而是像画布一样。我已经尝试使用matplotlib作为backend_kivyagg来实现这一点,但是我无法为每个subplot that I created设置固定大小。

我不知道有多件事,为什么会像它们一样发生。

from math import sin, cos

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.uix.widget import Widget

from kivy.garden.graph import Graph, MeshLinePlot


class Plot(Widget):
    def __init__(self):
        super(Plot, self).__init__()
        self.graph = Graph(xlabel="x", ylabel="y", x_ticks_minor=5, x_ticks_major=25, y_ticks_major=1,
                           y_grid_label=True, x_grid_label=True, x_grid=True, y_grid=True,
                           xmin=-0, xmax=100, ymin=-1, ymax=1, draw_border=False)
        # graph.size = (1200, 400)
        # self.graph.pos = self.center

        self.plot = MeshLinePlot(color=[1, 1, 1, 1])
        self.plot.points = [(x, sin(x / 10.)) for x in range(0, 101)]
        self.plot2 = MeshLinePlot(color=[1, 0, 0, 1])
        self.plot2.points = [(x, cos(x / 10.)) for x in range(0, 101)]
        self.add_widget(self.graph)

        self.graph.add_plot(self.plot)
        self.graph.add_plot(self.plot2)


class GraphLayoutApp(App):

    def build(self):
        scroll_view = ScrollView()
        grid_layout = GridLayout(cols=1, row_force_default=True, padding=20, spacing=20)
        graph = Plot()
        graph2 = Plot()
        label = Label(text="Hello World!")
        label2 = Label(text="Hello World!")
        grid_layout.add_widget(label)
        grid_layout.add_widget(graph)
        grid_layout.add_widget(label2)
        grid_layout.add_widget(graph2)
        scroll_view.add_widget(grid_layout)

        return scroll_view


if __name__ == '__main__':
    GraphLayoutApp().run()
  

问题

     
      
  1. 在GraphLayoutApp类中,我创建了两个对象graph和graph2,但是如果将它们添加到GridLayout()中,只会出现一个对象吗?怎么样   我可以添加多个图形吗?

  2.   
  3. 也在类GraphLayoutApp的build方法内,我创建了两个标签。我想先显示第一个label,然后显示图形   然后是第二个标签label2。但在我看来,该图   总是显示在左下角。我想这必须要做   用它在上面绘制的画布,但我无法解决。

  4.   

1 个答案:

答案 0 :(得分:2)

这是修正的版本,其中修复了一些问题:

这里的问题是您使Plot从Widget继承而来,该Widget实际上是框架中最基本的Widget,并且由于它不是布局,因此无法管理添加到其中的子项中的任何内容,因此{{ 1}}添加到它的窗口小部件保留默认大小/位置(分别为[100,100]和[0,0]),因此它们彼此堆叠,我使用了RelativeLayout,它默认将子级设置为其自己的大小和位置,因此Graph跟随小部件。另一个解决方案是简单地使Plot从Graph继承,因为它是唯一的子级,并使用“ self.add_plot”而不是“ self.graph.add_plot”,并覆盖Graph参数,最好的解决方案可能是创建一个绘图类的KV规则。但是第一个解决方案是对代码的最小改动。

您错过的一般原则是,在奇异果中,小部件默认情况下不受任何位置/大小的约束,除非它们的父级是专门管理此布局的布局(如GridLayout为您的标签所做的那样)。

我还使GridLayout自动将其自身的大小调整为minimum_size(由我在所有小部件中放入的硬编码大小确定),因此您实际上还有一些可以滚动的东西。

这段代码也是由python驱动的,从本质上来说,您通常希望使用KV而不是对静态事物使用Graph做更多的事情。

add_widget