Kivyのkv言語におけるon_press中のif文で複数の処理を実行するの巻

はじめに

kvファイルだけでon_pressなどのイベントのときにif文を使いつつ複数の処理をやりたいときがあるのよね。

Python側で関数を定義すればいいじゃんていう話もありますが、

そうするまでもないようなときとか、Python部分とkv言語部分を行ったり来たりするのが面倒なときとかがありまして。

で、あれ?どうすんの?となりまして。その備忘録です。

結論としては

やりたい処理を ; (セミコロン)で区切る

だけでよかったのでした。わあ簡単。

やってみる

例として下に記載したことをやることにします。

  • ボタン中のtextが ‘zettai osunayo’のときにボタンを押したら
    • フォントサイズを3倍に変更する
    • textのcolorを(1,0,0,1)に変更する
    • textを’osunatteba’に変更する
  • textが ‘zettai osunayo’ でない時にボタンを押したら
    • フォントサイズを80に戻す
    • textの色を白(1,1,1,1)に戻す
    • textの内容を’zettai osunayo’に戻す

コードは以下のものです。

.pyファイル

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.lang import Builder


Builder.load_string('''
<Otameshi>
    Button:
        text: 'zettai osunayo'
        font_size: 80
        on_press: 
            if self.text == 'zettai osunayo': self.text = 'osunatteba'; self.font_size = self.font_size*3; self.color = (1,0,0,1)
            else: self.text = 'zettai osunayo';self.font_size = 80; self.color = (1,1,1,1)

''')

#give class the name of Otameshi 
class Otameshi(BoxLayout):
    pass

#give class the name of App 
class SemicolontestApp(App):

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

    def build(self):
        return Otameshi()

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

実行結果。

でけた。

ちなみに、記述が長くなるようだったらPythonと同じようにバックスラッシュ「 \ 」で文の途中で改行を入れられる、と。(なお、.kvファイルに記述している場合は、ifの行以降のインデントをifの行と同レベルに揃えてフラットにしておかないとダメみたいです)

(on_pressのところを抜粋)

        on_press: 
            if self.text == 'zettai osunayo':\
                self.text = 'osunatteba';\
                self.font_size = self.font_size*3;\
                self.color = (1,0,0,1)
            else:self.text ='zettai osunayo';\
                self.font_size= 80;\
                self.color = (1,1,1,1)

最初はセミコロン付けずにやろうとして、、、

(on_pressのところを抜粋)

        on_press: 
            if self.text == 'zettai osunayo': 
                self.text = 'osunatteba'
                self.font_size= self.font_size*3 
                self.color = (1,0,0,1)
            else: 
                self.text = 'zettai osunayo'
                self.font_size= 80
                self.color = (1,1,1,1)

怒られた。

 kivy.lang.parser.ParserException: Parser: File "<inline>", line 8:
 ...
       6:        on_press: 
       7:            if self.text == 'zettai osunayo': 
 >>    8:                self.text = 'osunatteba'
       9:                self.font_size= self.font_size*3 
      10:                self.color = (1,0,0,1)
 ...
 Invalid indentation (too many levels)

kv言語中のif文では改行ではなくて、セミコロンで分割するのね。わかりました。

おしまい

実施環境

Python 3.9.4

Kivy                     2.0.0

macOS Catalina ver.10.15.7

参考にしたページなど

https://stackoverflow.com/questions/37180943/kivy-firing-multiple-functions-on-1-button-click

https://stackoverflow.com/questions/62452317/how-can-i-do-a-line-break-line-continuation-in-a-kv-file



https://business.xserver.ne.jp/

https://www.xdomain.ne.jp/

★LOLIPOP★

.tokyo

MuuMuu Domain!