Python Kivy スライダーの使い方 グラフをリアルタイムで更新する方法

まくまく
まくまく
PythonのGUIアプリ作成ライブラリ kivyのスライダーを使用してMatplotlibのグラフをリアルタイムで更新してみようと思います。

スライダーを使えるようになると、パラメーターを変更したり、グラフを更新したりするのがマウスやタッチ操作で行えるようになります。しかもその操作をリアルタイムで反映できます。今回は、Matplotlibで作成した散布図のプロットをスライダーでグリグリ動かしてみます。結構苦戦しましたが、なんとか思い通りの動きになりました。



出力


プログラムを実行するとこのようなウインドウが立ち上がります。上部がグラフエリア、下部はスライダーエリアです。

グラフはMatplotlibの散布図を表示しています。スライダーの初期値はX、Yともに50に設定。


X軸のスライダーを動かすとグラフのプロット(バツ印)がX方向にリアルタイムで動きます。右下のラベルもリアルタイムで更新されます。


Y軸のスライダーでも同様にリアルタイムでグラフとテキストが更新されます。

サンプルプログラム

pyファイル

#ライブラリのインポート
from kivy.app import App
from kivy.config import Config
from kivy.uix.widget import Widget
from kivy.lang import Builder
from matplotlib.markers import MarkerStyle
from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
import matplotlib.pyplot as plt
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
import numpy as np

#kvファイルの読み込み
Builder.load_file("mat_slider.kv")

class Graphview(FloatLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.xx = 50
        self.yy = 50
        self.fig, self.ax = plt.subplots()
        #散布図
        self.scat = self.ax.scatter(self.xx, self.yy, marker="X", s=200)
        self.ax.set_xlim(0,300)
        self.ax.set_ylim(0,300)
        self.ax.set_xlabel("X")
        self.ax.set_ylabel("Y")
        self.ax.set_title("Kivy x Matplotlib with Slider", size=14)
        self.box = self.ids.box
        self.box.add_widget(FigureCanvasKivyAgg(self.fig))

    def update_xvalue(self, xvalue):
        self.slide_xtext.text = str(xvalue)
        self.xx = xvalue
        self.scat.set_offsets((self.xx, self.yy))
        self.fig.canvas.draw()
 
    def update_yvalue(self, yvalue):
        self.slide_ytext.text = str(yvalue)
        self.yy = yvalue
        self.scat.set_offsets((self.xx, self.yy))
        self.fig.canvas.draw()


class DispgraphApp(App):
    def build(self):
        self.title = "window"
        return Graphview()

if __name__ == '__main__':
    DispgraphApp().run()

kvファイル

#ファイル名: mat_graph2.kv
<Graphview>
    canvas.before:
        Color:
            #rgba: 88/255, 38/255, 48/255, 1
            rgba: 17/255, 117/255, 150/255, 1
        Rectangle:
            pos: self.pos
            size: self.size

    slide_xtext: slider_xlabel
    slide_ytext: slider_ylabel

    BoxLayout:
        orientation: "vertical"
        size: root.width, root.height
        padding: 20

        id: box
        pos_hint: {"top":1}
        size_hint_y: .8
        #size_hint: (1, 1)

    GridLayout:
        cols: 3
        padding: 20
        size_hint_y: .2
        
        Slider:
            id: xvalue
            min: 1
            max: 280
            step: 1
            value: 50
            orientation: "horizontal"
            on_value: root.update_xvalue(xvalue.value)
            size_hint: (5, 0.5)

        Label:
            text: "X :"
            font_size: 32
            size_hint: (0.5, 0.5)

        Label:
            id: slider_xlabel
            text: "50"
            font_size: 32
            size_hint: (0.5, 0.5)

        Slider:
            id: yvalue
            min: 1
            max: 280
            step: 1
            value: 50
            orientation: "horizontal"
            on_value: root.update_yvalue(yvalue.value)
            size_hint: (5, 0.5)

        Label:
            text: "Y :"
            font_size: 32
            size_hint: (0.5, 0.5)

        Label:
            id: slider_ylabel
            text: "50"
            font_size: 32
            size_hint: (0.5, 0.5)

kivy関連の記事はこちらにまとめています。>>>Python kivy 使い方まとめ

タイトルとURLをコピーしました