首页 > 解决方案 > Kivy:使用滑块更新 matplotlib 画布

问题描述

我需要创建一个更新 matplotlib 图形的滑块。到目前为止,我有这个,main.py:

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

class Container(BoxLayout):
    display = ObjectProperty()
    def __init__(self, *args, **kwargs):
        global canvas
        super(Container, self).__init__(**kwargs)
        lum_img = np.random.rand(10,10)
        plt.imshow(lum_img, cmap="gray")
        plt.colorbar() 
        canvas = FigureCanvasKivyAgg(plt.gcf())
        self.ids.box_display.add_widget(canvas)
        canvas.draw()

    def add_one(self, value):
        lum_img = np.random.rand(10,10)
        plt.imshow(lum_img, cmap="gray")
        plt.colorbar() 
        canvas.draw()

        self.display.text = str(round(value,2))



class MainApp(App):
    def build(self):
        self.title = 'Image and slider app'

        return Container()


if __name__ == "__main__":
    app = MainApp()
    app.run()

和 main.kv:

<Container>:
    display: display
    id: main_display
    orientation: "vertical"

    BoxLayout:
        id: box_display
        orientation: "vertical"


        Slider:
            id: slider_image
            min: 0
            max: 1
            value: 0.5
            on_value: root.add_one(value = slider_image.value)

    Label:
        id: display
        font_size: dp(50)
        text: '0'

行为不像预期的那样,它只是移动它而不是更新图像画布!我认为错误是将画布声明为全局变量,但不这样做我不知道如何更新它。

任何想法?

标签: pythonmatplotlibkivy

解决方案


误解了你想要的(我的错误)。如果您不想创建新的绘图,而只是更新现有的绘图,则只需plt.clf()在您的add_one()方法中添加一个调用,然后再进行任何其他绘图。这将清除当前图形,并允许您将其替换为新图形。


推荐阅读