Kivyでwidgetの幅が変わるのに合わせてテキストのフォントサイズを変えるの巻

Kivyでwidgetの幅が変わるのに合わせてテキストのフォントサイズを変えるの巻

はじめに

Kivyにおいて、ウィンドウサイズに合わせてwidgetの幅が変化するようにしているときに、それに合わせてtextのフォントサイズも変えたいねっていう時がありまして。

Python側で関数を設定せずにKv言語側でフォントサイズをいじる方法のメモです。

Python側で関数を作ってもいいんでしょうけど、widgetへのアクセスルートがややこしいときがあって、kivy言語で直接いじれたら楽やん。ていう。

ええっと、こんな感じで、テキストが見切れるのを、、、

こうする、と。

というわけで、ウィンドウの幅を変えた時にwidgetの幅が変わるのに合わせて一緒にテキストのフォントサイズを変えてtextの全体を確認できるようにできるようになりました。

やりかた

なんというか、font_sizeについて、

defaultで表示したいフォントサイズ × self.width(widgetのwidth) / widgetのdefaultのwidth

としただけです。

対応するPythonのコードを次に示します。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.lang import Builder


Builder.load_string('''
<Otameshi>
    Label:
        text: 'Flexible Font Size'
        font_size: 200*self.width/1600 
''')

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

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

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

    def build(self):
        return Otameshi()

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

でも、このままだとwidgetの幅がdefaultのサイズより大きくなったときにフォントサイズが大きくなりすぎるので、

ある一定幅以下のwidget widthになったときにだけfont_sizeが小さく変わるようにしてみます。

font_sizeのところを

font_size: 80 if 80*self.width/800 >= 80 else  80*self.width/800

にして、

default のフォントサイズが80で、widget widthが800以上の時は80を維持して、800より狭くなったらそれに合わせてfont_sizeを小さくするようにしてみます。

でけた。

ついでに、他も試してみます。

ここではLabelの背景色とtextの内容とfont_sizeを一緒に変化させてみます。

でけた。

コードは以下です。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.lang import Builder

#added below for making rounded button
from kivy.graphics import Color, Rectangle


Builder.load_string('''
<Otameshi>
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 
                'Blue' if self.width >= 1200\
                else 'Yellow' if self.width >= 800\
                else 'Red' 
            font_size: 80 if 80*self.width/800 >= 80 else 80*self.width/800
            background_color:(0,0,0,0)
            background_normal:''
            canvas.before:
                Color:
                    rgba:(0/255,0/255,255/255,0.6) if self.width >= 1200\
                    else (255/255,255/255,0/255,0.6) if self.width >= 800\
                    else (255/255,0/255,0/255,0.6)
                Rectangle:
                    size: self.size
                    pos: self.pos
''')
#give class the name of Otameshi 
class Otameshi(BoxLayout):
    pass

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

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

    def build(self):
        return Otameshi()

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

以下、追加部分の説明です。

from kivy.graphics import Color, Rectangle

canvasを使って背景を変えるので、ColorとRectangleを入れて、

           text: 
                'Blue' if self.width >= 1200\
                else 'Yellow' if self.width >= 800\
                else 'Red' 

textは、Label widgetの幅が1200以上で’Blue’, 800以上は’Yellow’、それ以外は’Red’を表示するようにして、

            background_color:(0,0,0,0)
            background_normal:''

backgroundを一旦解除してやってから、

           canvas.before:
                Color:
                    rgba:(0/255,0/255,255/255,0.6) if self.width >= 1200\
                    else (255/255,255/255,0/255,0.6) if self.width >= 800\
                    else (255/255,0/255,0/255,0.6)
                Rectangle:
                    size: self.size
                    pos: self.pos

canvas.beforeのColorをLabel widgetの幅によって色を変えて、、、というRectangleで背景色を描画しています。

他にもいろいろ使いどころがありそうですね。

おわりに

フォントサイズを変更するなどの簡単なことならKv言語のほうでもいろいろ制御できることがわかってきました。(もっと合理的でシンプルな方法があるかもしれませんよ。。。)

とにかく、Kivyを触っていて、あれこれどうやるの?となったときに方法が簡単に見つからない(見つかったように思えても今度は理解が追いつかない)ことが多いので、

こういったちょっとしたことでも分かったことを残していけたらと思っています。

実施環境

Python 3.9.4

Kivy                     2.0.0

macOS Catalina ver.10.15.7



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

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

★LOLIPOP★

.tokyo

MuuMuu Domain!