我已经使用 Kivy 几天了,目前正在开发一个需要在其中嵌入 Matplotlib 图的应用程序。在在线资源的帮助下,我成功地在我的 kivy 应用程序中嵌入了一个绘图,但我在使用导航工具栏时遇到了问题。
## Imports
## ...
class MyApp(App):
def build(self):
box = BoxLayout(orientation='vertical')
box.add_widget(Label(text='My App', size_hint_y=.1))
plt.plot([1, 3, 2, 4])
canvas = FigureCanvasKivyAgg(plt.gcf())
toolbar = NavigationToolbar2Kivy(canvas)
box.add_widget(canvas)
box.add_widget(toolbar.actionbar)
return box
MyApp().run()
上面的代码产生以下输出:
如您所见,导航工具栏处只有一个黑色矩形可见。我看不到任何按钮(即工具 - “平移”、“缩放”、“主页”等)。
我确实认为按钮的颜色可能与导航工具栏的背景颜色相同,所以我尝试像这样更改背景颜色:
toolbar.actionbar.background_image = ''
toolbar.actionbar.background_color = (1, 1, 1, .5)
box.add_widget(toolbar.actionbar)
但这只是导致了一个灰色的矩形。我仍然看不到任何与绘图交互的导航工具栏按钮。
有一个与此类似的问题here,但提供的解决方案似乎不适用于我的情况。
帖子的答案表明导航工具栏仅适用于父布局,我已经尝试过如下所示:
class MyApp(App):
def build(self):
box = BoxLayout(orientation='vertical')
child_box = BoxLayout(orientation='vertical')
box.add_widget(child_box) ## parent layout: box, child layout: child_box
child_box.add_widget(Label(text='My App', size_hint_y=.1))
plt.plot([1, 3, 2, 4])
canvas = FigureCanvasKivyAgg(plt.gcf())
toolbar = NavigationToolbar2Kivy(canvas)
## toolbar.actionbar.background_image = ''
## toolbar.actionbar.background_color = (1, 1, 1, .5)
child_box.add_widget(canvas)
box.add_widget(toolbar.actionbar)
return box
MyApp().run()
但这会产生与我的输出图像中显示的结果相同的结果(如果我取消注释注释行,则矩形区域的颜色为灰色)。
问题出在 matplotlib 的版本上。从 3.3.3 开始的 matplotlib 版本中会遇到此错误。因此,解决方案是将 matplotlib 降级到 3.3.2。
但是为了做到这一点,您可能需要将 python 降级到 3.8 左右。
因此,解决方法如下:
pip install "matplotlib<3.3.3"
pip install "matplotlib<3.3.3"
使用 matplotlib 3.3.2(和 Python 3.8),相同的代码对我有用:
import matplotlib.pyplot as plt
import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
from kivy.garden.matplotlib.backend_kivyagg import NavigationToolbar2Kivy
class MyApp(App):
def build(self):
box = BoxLayout(orientation='vertical')
box.add_widget(Label(text='My App', size_hint_y=.1))
plt.plot([1, 3, 2, 4])
canvas = FigureCanvasKivyAgg(plt.gcf())
toolbar = NavigationToolbar2Kivy(canvas)
box.add_widget(canvas)
box.add_widget(toolbar.actionbar)
return box
MyApp().run()
可以使用以下方法更改导航工具栏的背景颜色:
toolbar.actionbar.background_image = ''
toolbar.actionbar.background_color = (1, 1, 1, 1) ## White background