2020年6月16日火曜日

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

先月RGBのパラメータを入力するスライダー、テキストボックス連動クラスを作成し、Python2 から Python3 に移行したら動かなかったと書いたのですが…
動きました。
と、いうか作り直しました。
そもそも、ラベル、スライダー、テキストボックスの3個のアイテムを子に持つクラスを、更に3個束ねていたのですが
コレでタイミングエラーが出るなら、全9個のアイテムを1個のクラスでまとめれば良いのでは?
と、考えて作ってしまったのがこちらです。

コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
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 SlR(Slider):
    def on_touch_up(self,touch):
        self.parent.tR.text = str(int(self.value))

class TxR(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.sR.value = value
        else:
            self.text=str(int(self.parent.sR.value))

class SlG(Slider):
    def on_touch_up(self,touch):
        self.parent.tG.text = str(int(self.value))

class TxG(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.sG.value = value
        else:
            self.text=str(int(self.parent.sG.value))

class SlB(Slider):
    def on_touch_up(self,touch):
        self.parent.tB.text = str(int(self.value))

class TxB(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.sB.value = value
        else:
            self.text=str(int(self.parent.sB.value))

class GridRGBParm(GridLayout):
    def __init__(self,**kwargs):
        super(GridRGBParm,self).__init__(**kwargs)
        self.SetUp()

    def SetUp(self):
        self.clear_widgets()

        self.cols=3

        self.min = 0
        self.max = 255

        self.lR = Label(text='R',size_hint_x=1)
        self.sR = SlR(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.tR = TxR(text=str(self.min),multiline=False,size_hint_x=2)

        self.lG = Label(text='G',size_hint_x=1)
        self.sG = SlG(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.tG = TxG(text=str(self.min),multiline=False,size_hint_x=2)

        self.lB = Label(text='B',size_hint_x=1)
        self.sB = SlB(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.tB = TxB(text=str(self.min),multiline=False,size_hint_x=2)

        self.add_widget(self.lR)
        self.add_widget(self.sR)
        self.add_widget(self.tR)

        self.add_widget(self.lG)
        self.add_widget(self.sG)
        self.add_widget(self.tG)

        self.add_widget(self.lB)
        self.add_widget(self.sB)
        self.add_widget(self.tB)

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

    self.GridRGB = GridRGBParm(size_hint_y=1)
    self.add_widget(self.GridRGB)

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

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


…冗長ですねえ。全く同じ処理を3回ずつ書いています。
職業プログラマがこんなコード書いたら怒られそうですが、あいにく私は意識低い系です。動けばよかろうなのだ!

0 件のコメント:

コメントを投稿