【问题标题】:How do you create a Matplotlib widget in Kivy kv file?如何在 Kivy kv 文件中创建 Matplotlib 小部件?
【发布时间】:2018-04-25 01:24:23
【问题描述】:

我想使用 .kv 文件来制作 Matplotlib 小部件,但我不知道该怎么做。

如果没有 .kv 文件,基本代码如下所示:

from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
import matplotlib.pyplot as plt

plt.plot([1, 23, 2, 4])
plt.ylabel('some numbers')

class MyApp(App):

    def build(self):
        box = BoxLayout()
        box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
        return box

MyApp().run()

如何使用 .kv 文件完成此操作?

【问题讨论】:

    标签: python matplotlib kivy kivy-language


    【解决方案1】:

    所以这就是我想出的。在 .KV 语言文件中,您指定一个布局并给它一个 id:

    BoxLayout:
        id: destination
    

    然后在您的 python 代码中使用以下内容:

    self.ids.destination.add_widget(FigureCanvasKivyAgg(plt.gcf()))
    

    因此,您可以有效地使用在 kivy 语言文件中设置的 id 作为 matplotlib 图形的参考。

    【讨论】:

    • 我不知道如何处理您的代码。在上面的示例中,您在 MyApp 的 __init(self)__ 方法中添加了self.ids.destination.add_widget(FigureCanvasKivyAgg(plt.gcf()))?
    • 你可以把它放在任何地方,在你正在调用的函数或方法中。如果您想在窗口生成后立即绘制图形,那么您可以将其放入 App 类的 build 方法中。我实际上是在一个自定义方法中使用它,每当我将文件放在窗口上时都会调用该方法。所以我在窗口上放了一个文件,它会为我将数据绘制成图表。
    • 你是救生员。撞了这么多没完没了的路,终于明白可以直接做引用id了。我用 self.root.ids.destination.add_widget(FigureCanvasKivyAgg(plt.gcf())) 代替
    • @astroflyer 最初我有一段时间让这个工作正常,所以我很高兴我的回答有帮助!!
    【解决方案2】:

    您(和我)需要像 John Anderson 对Python to KV Lang - FigureCanvasKivyAgg 的回答一样扩展 FigureCanvasKivyAgg:

    #!/usr/bin/env python3
    from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
    from kivy.app import App
    import matplotlib.pyplot as plt
    
    plt.plot([1, 23, 2, 4])
    plt.ylabel('some numbers')
    
    class MyFigure(FigureCanvasKivyAgg):
        def __init__(self, **kwargs):
            super().__init__(plt.gcf(), **kwargs)
    
    class MyApp(App):
        pass
    
    MyApp().run()
    

    上述问题的kv文件:

    BoxLayout:
        MyFigure:
    

    这个修复也让我可以设置人物的位置:

    FloatLayout:
        MyFigure:
            pos: (400, 20)
            size: (300, 200)
            size_hint: (None, None)
    

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多