2019年9月19日木曜日

Python+Kivy 備忘録 画面遷移編

はい、Tips書くほど賢く無い、PG辞めて10年以上(現役期間より辞めた後の時間の方が長くなってしまいました)の人間が何を書いているんだって話ですけど、
歳なんで物忘れが激しいのですよ。
で、今回作った物はこんな感じ。
boxlayout 継承クラスの Display クラスの中に、boxlayout 継承クラスの SubDisplay クラスを作りまして、SubDisplay クラスの中にあるボタンを押すことで、SubDisplay クラスの再描画をやらせましょうというサンプルです。

change ボタンを押すと以上の二つの画面が交互に切り替わります。

コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label

class BtnChangeYoko(Button):
  def on_press(self):
    self.parent.parent.lMode.text='Yoko'
    self.parent.DrawYoko()

class BtnChangeTate(Button):
  def on_press(self):
    self.parent.parent.lMode.text='Tate'
    self.parent.DrawTate()
class SubDisplay(BoxLayout):
  def DrawTate(self):
    self.clear_widgets()
    self.orientation='vertical'
    b1 =BtnChangeYoko(text='change',size_hint_y=1)
    b2 =Button(text='dummy',size_hint_y=2)
    self.add_widget(b1)
    self.add_widget(b2)
  def DrawYoko(self):
    self.clear_widgets()
    self.orientation='horizontal'
    b1 =BtnChangeTate(text='change',size_hint_x=1)
    b2 =Button(text='dummy',size_hint_x=2)
    self.add_widget(b1)
    self.add_widget(b2)
class Display(BoxLayout):
  orientation='vertical'
  def __init__(self,**kwargs):
    super(Display,self).__init__(**kwargs)
    self.lMode = Label(text='Mode',size_hint_y=1)
    self.boxSub = SubDisplay(size_hint_y=9)
    self.add_widget(self.lMode)
    self.add_widget(self.boxSub)
    self.boxSub.DrawYoko()

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

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

※追記 ubuntu20.04 上の python3 + python3-kivy にて動作を確認しました
※追記 Android 4.4/5/6/8 上の Kivy Launcher にて動作を確認しました 
ミソは button 継承クラスの BtnChange~ クラスのコールバック関数 on_press の中身。
各ボタンは SubDisplay クラスの子になるのですが、親の親である Display クラスの子の label (lMode)を書き換えて、親クラス SubDisplay の再描画関数 Draw~ を呼んでいます。

  • なんでこんなコードを書いたの?
確かにKV言語を使うと綺麗な配置のGUIが作れるんですけどね、ちょっと変わった動きや、画面の再描画処理を書き始めると…

「悪い、やっぱ辛えわ」

となりまして、なんというか kv と python の二つの仕様を跨いだ書き方を調べながら書くのが面倒というか、昔 MFC 継承クラスを作っていたので「何を作ったら良いかは解るけど、どう書いたら良いか判らない」事が頻発しまして、

「俺、コード直書きの事、好きだわ」

になってしまったのですよ。
実は作っているアプリでディレクトリ名を取得する処理を書いていて、FileChooser を調べたりしていたのですが、どうにも煩雑な処理になってきまして。シングルタップでディレクトリ名取得、ダブルタップで下階層へ移動するようにコールバックを改造するにはどうするんだ?となった折、流石に kv を交えているのは厳しいと。

そんな訳で、慣れるか壁にぶち当たるまでは kv 無しの kivy 道を走る事になりそうです。

0 件のコメント:

コメントを投稿