🐈‍⬛

Python + Kivy で作ってみた【Ⅳ】

2023/06/27に公開

付加機能

付加機能として真っ先に浮かんだのが、ズーム機能
現在は等倍表示だが、0.1~10倍の表示を行いたい
でも、表示部のど真ん中を中心に拡大縮小するだけでは面白くない…

任意のポイントを中心に拡大縮小を行いたいが、どうやって指定するか?
ぱっと思いついたのがクロスゲージ、照準器のような十字線を表示する方式
ただ、十字線を動かすためにマウスでつかむのが大変そう…

そこで箱形の十字線、漢字の「井」のようにゲージ線を4本引き、
囲まれた四角形の部分をマウスでつかんで動かす
そして、その四角形の中心を中心に拡大縮小を行う

このように四角形で囲むとその部分を強調表示しているようにも見える
まさに、「ここ大事!テストに出るよ!!」といわんばかり😼
四角形の大きさを変更できるようにすることも考えておこう
マウスでラインをつかむのは大変かもしれないが…

もうひとつ、PDFファイルの選択・読込をつける
これは基本機能かもしれない💦

その前に…

現在、コード部とUI部を別ファイルにしてコーディングしている
それでも、かなりズラズラ、ダラダラと記述して見通しが悪くなってきた
できればモジュール分割等をして別ファイルにしたい

ファイル分割

kvファイルはできればwidgetごとに別ファイルにしたい
pythonコード部はクラスばかりだが、どのように別ファイルにするか
それぞれ可能性を探っていく

kvファイル

kv言語には「include」という、別ファイルを読み込むメソッドがある
これは楽勝か?と思ったが、全くダメだった_| ̄|○

includeで読み込んだwidgetに対応した、
pythonコード部に記述したwidget名クラスの
コンストラクタが呼ばれない

ということはインスタンス化されていないということか?
確かに、独自に追加したプロパティはないといわれるし、
kvファイル内でwidgetのidでアクセスできない

includeを使えるシーンはあるかもしれないが、
基本的にkvファイルは一つじゃないとダメなようだ

pythonコード部

PDF画像を作るモジュールを別ファイルにすることはできる
その他は、クラスばかりでどう分割するのか悩む

いろいろと考えて、クラスの継承を使うことにした
例えば、ViewAreaWidgetクラスを次のように別ファイル化した

【main.py】
class ViewAreaWidget( ViewAreaBase ) :
    def __init__( self, **kwargs ) :
    ...
    ...

【view.py】
class ViewAreaBase( Widget ) :
    def __init__( self, **kwargs ) :
    ...
    ...

    def on_kv_post( self, base_widget ) :
    ...
    ...

    def on_touch_down( self, touch ) :
    ...
    ...

    def on_touch_move( self, touch ) :
    ...
    ...

これで、mainがかなりスッキリした
viewはイベントメソッドが多いため、ファイルは長くなってしまうが
そこは仕方ない、

後は、mainでview.pyをimportすればOK

from lib.header             import HeaderBase
from lib.footer             import FooterBase
from lib.view               import ViewAreaBase

同様に、header.py、footer.pyを作り
libフォルダーにまとめて配置した

次回は、PDFファイルの選択・読込を考えよう

Discussion