2020年2月12日水曜日

Python+Kivy 備忘録 スライダー、テキストボックス連動編

半年ぶりですね。
思い出して、作って、忘れて、又思い出すというとんでもなく生産性の悪い事をしております。
…だから備忘録が必要な訳で、私は間違っていない…ハズ。
今回はそこそこ汎用性のありそうな、ラベル、スライダー、テキストボックスのセットを作りまして、スライダーとテキストボックスの連動を行ってみたのですが…
検索すると判ると思いますが、kv ファイルを用いたサンプルはネット上にあったのですが、例によって python オンリーが無くてですね、結構試行錯誤してようやく動いたのですが…

コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.slider import Slider
from kivy.uix.floatlayout import FloatLayout

### Input Color Value
class TxiColor(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.SetValue(value)
        self.parent.ReDraw()

class SlColor(Slider):
    def on_touch_up(self,touch):
        value = int(self.value)
        self.parent.SetValue(value)
        self.parent.ReDraw()

class BoxColor(BoxLayout):
    def __init__(self,**kwargs):
        super(BoxColor,self).__init__(**kwargs)
        self.SetUp('',0,100)

    def SetUp(self,text,min,max):
        self.tName = text
        self.min = min
        self.max = max
        self.value = min

        self.clear_widgets()
        self.orientation='horizontal'

        self.l1 = Label(text=self.tName,size_hint_x=1)
        self.s1 = SlColor(min=self.min,max=self.max,value=self.value,size_hint_x=7)
        self.t1 = TxiColor(text=str(self.value),size_hint_x=2,multiline=False)

        self.add_widget(self.l1)
        self.add_widget(self.s1)
        self.add_widget(self.t1)

    def SetValue(self,value):
        self.value = value

    def ReDraw(self):
        self.s1.value = self.value
        self.t1.text = str(self.value)

class Display(BoxLayout):
    orientation='vertical'
    def __init__(self,**kwargs):
        super(Display,self).__init__(**kwargs)

        self.boxR = BoxColor(size_hint_y=1)
        self.boxR.SetUp('R',0,255)
        self.add_widget(self.boxR)

        self.boxG = BoxColor(size_hint_y=1)
        self.boxG.SetUp('G',0,255)
        self.add_widget(self.boxG)

        self.boxB = BoxColor(size_hint_y=1)
        self.boxB.SetUp('B',0,255)
        self.add_widget(self.boxB)

class MainApp(App):
    def build(self):
        layout = Display()
        return layout

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


実行結果※ python2.7 Linux Mint 19.2 上のものです

キモが BoxColor クラスなのは見れば判ると思うのですが…不可解な部分が有るんですよね。
ソレが変色させた部分。
実は普通に BoxColor に再描画処理を書いて子クラスから呼ばせる方法で作っていたのですが、どうしてもエラーが出る為、苦し紛れに書いたら動いてしまったのですよ。
ReDraw 関数の中身は見ての通り、各子クラスのメンバー変数に値を入れているだけです。…私の頭が古いせいか、子クラスのメンバー変数に直接値を代入するだけでも保守性が心配になるのですが…
どうして再描画されたのか?そもそも再描画のタイミングとは?動きはしたものの疑問がいっぱいです。

0 件のコメント:

コメントを投稿