将按钮和matplotlib添加到boxlayout

时间:2020-08-01 06:29:00

标签: python matplotlib user-interface kivy

在kivy中,我调出一个modalview,在那个modalview中是一个Boxlayout,它将有2个小部件。 1个小部件可以是任何东西,另一个是matplotlib图-这样我可以同时看到它们。

我无法让modalview与matplotlib一起使用,当我运行它时,它取消了modalview并只显示了matplotlib-再次,整个modalview都没有出现,只是图而已。我尝试制作另一个具有有限size_hint的kivy小部件,然后在其中添加绘图,然后将该小部件添加到我的主要boxlayout中,但结果相同

我已经附加了我的kivy代码和该图的代码,图像就是我想要的modalview的样子,其中右侧是该图

最后,我确定还有其他方法可以完成我想做的事情,例如matplotlib有一些我可以使用的小部件。但这似乎是一种坏习惯,突然从我一直在使用的奇异果转变为我敢打赌可以做到这一点

有什么建议吗?

   mainview = ModalView(size_hint = (0.6, 0.7))
   box = BoxLayout(orientation = 'horizontal')   # cols not rows

   box.add_widget(Button(text = "place holder", size_hint_x = 0.3))
   box.add_widget(python_testing.make_plot())

   mainview.add_widget(box)
        
   mainview.open()
   # this is python_testing.make_plot() mentioned above
   # Prepare the data
   x = [1,2,3,4,5,6,7,8,9,10]
   ratings = [4,5,8,9,4,3,2,6,8,7]

   plt.figure(num='cde')
   plt.plot(x, ratings, label='cde')
   plt.legend()   # Add a legend
   plt.show()     # Show the plot

What I want my modalview to look like but with the plot in the right side

1 个答案:

答案 0 :(得分:0)

解决方案:我发现可以将matplotlib与kivy集成的东西,但是文档非常糟糕,但是我发现的解决方案更好。

我发现了kivy garden(用户制作的kivy包),该包具有用于制作kivy图表的包。附件是我的新代码和我的程序的屏幕截图

代码:用户按下了触发该方法的按钮。它制作了一个modalview,其中包含一个boxlayout,其中包含2个小部件-1是由标签和按钮组成的可滚动网格布局,另一个是绘图。该绘图的代码是第二段代码

    # pm: ticker = ticker clicked
    def modal_view(self, ticker, instance):
        mainview = ModalView(size_hint = (0.75, 0.75))
        box = BoxLayout(orientation = "horizontal")
        
        # make a scrollable gridlayout
        scroll = ScrollView(do_scroll_x = False, do_scroll_y = True, size_hint_x = 0.3)                           # a scroll view will contain the ticker gridlayout
        ticker_grid = GridLayout(rows = len(self.ticker_list), cols = 2, size_hint_y = None)   # holds tickers
        ticker_grid.bind(minimum_height = ticker_grid.setter("height"))                    # makes the gridlayout scrollabel via the scrollview
        
        # populate the scrollview / gridlayout
        for i in range(0, len(self.ticker_list)):
            ticker_grid.add_widget(Label(text = self.ticker_list[i // 2], height = 200, size_hint_x = 0.6))
            ticker_grid.add_widget(Button(text = "", size_hint_x = 0.4))

            # if ticker is selected, add button to cancel it
            if (self.ticker_list[i] == ticker):
                ticker_grid.children[i].text = 'X'
                ticker_grid.children[i].fbind("on_release", self.modalview_cancel_ticker, ticker_grid.children[i])

        # combine everything
        scroll.add_widget(ticker_grid)                
        box.add_widget(scroll)
        box.add_widget(python_testing.make_graph())
        mainview.add_widget(box)
        
        mainview.open()
def make_graph():
    # Prepare the data
    x = [1,2,3,4,5,6,7,8,9,10]
    ratings = [4,5,8,9,4,3,2,6,8,7]

    # make the graph
    graph = Graph(xlabel='Dates', ylabel='Ratings', x_ticks_minor = 1, x_ticks_major = 2,
                    y_ticks_minor = 1, y_ticks_major = 2, y_grid_label=True, x_grid_label=True,
                    padding=5, x_grid=True, y_grid=True, xmin=0, xmax=10, ymin=0, ymax=10)

    plot = MeshLinePlot(color=[1, 0, 0, 1])
    plot.points = [(i, j) for i, j in zip(x, ratings)]

    graph.add_plot(plot)
    return graph

请注意,如果您使用此代码:在make_graph()中,显示数据点很麻烦。 plot.points = [(i, j) for i, j in zip(x, ratings)]是我唯一的方法

enter image description here

相关问题