在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
答案 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)]
是我唯一的方法