Kivy 中的 Matplotlib 导航工具栏

问题描述 投票:0回答:1

我已经使用 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()

上面的代码产生以下输出:

Output

如您所见,导航工具栏处只有一个黑色矩形可见。我看不到任何按钮(即工具 - “平移”、“缩放”、“主页”等)。


我尝试过的:

我确实认为按钮的颜色可能与导航工具栏的背景颜色相同,所以我尝试像这样更改背景颜色:

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()

但这会产生与我的输出图像中显示的结果相同的结果(如果我取消注释注释行,则矩形区域的颜色为灰色)。

python matplotlib kivy desktop-application
1个回答
0
投票

问题出在 matplotlib 的版本上。从 3.3.3 开始的 matplotlib 版本中会遇到此错误。因此,解决方案是将 matplotlib 降级到 3.3.2。

但是为了做到这一点,您可能需要将 python 降级到 3.8 左右。

因此,解决方法如下:

  1. 尝试
    pip install "matplotlib<3.3.3"

    如果不起作用(造轮子出错),请下载并安装 Python 3.8
  2. 使用
    pip install "matplotlib<3.3.3"
  3. 安装较旧的 matplotlib 版本
  4. 运行你的代码

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.