2020年7月2日木曜日

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

…実行結果は前回から変わらないので載せないのですが…

コード

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 SlPram(Slider):
    def on_touch_up(self,touch):
        self.parent.t.text = str(int(self.value))

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

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

    def SetUp(self):
        self.clear_widgets()

        self.cols=3

        self.min = 0
        self.max = 100

        self.l = Label(text='none',size_hint_x=1)
        self.s = SlPram(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.t = TxPram(text=str(self.min),multiline=False,size_hint_x=2)

        self.add_widget(self.l)
        self.add_widget(self.s)
        self.add_widget(self.t)

    def SetName(self,name):
        self.l.text = name

    def GetValue(self):
        return int(self.parent.s.value)

    def SetRange(self,range_min,range_max):
        if range_max<range_min:
            self.min = range_max
            self.max = range_min
        else:
            self.min = range_min
            self.max = range_max

        self.s.min = self.min
        self.s.max = self.max
        self.s.value = self.min
        self.t.text=str(self.min)

class Display(BoxLayout):
    orientation='vertical'

    def __init__(self,**kwargs):
        super(Display,self).__init__(**kwargs)

        self.GridR = GridPram(size_hint_y=1)
        self.GridG = GridPram(size_hint_y=1)
        self.GridB = GridPram(size_hint_y=1)

        self.GridR.SetName('R')
        self.GridG.SetName('G')
        self.GridB.SetName('B')

        self.GridR.SetRange(0,255)
        self.GridG.SetRange(0,255)
        self.GridB.SetRange(255,0)

        self.add_widget(self.GridR)
        self.add_widget(self.GridG)
        self.add_widget(self.GridB)

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

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


冗長な部分が気になって、まとめてみたのですが…
コレで動くって事は当初動かなかった理由は単純に BoxLayout のバグだったのでは?
モヤッとする解決ですねえ。

0 件のコメント:

コメントを投稿