kivy

kivy戦記(12) 画面遷移

kivy
この記事は約15分で読めます。

ここで問題が出た。
現状では、Rootフォルダーから検索となる。
TreeViewでツリー構造を一通り読み込ませる構造にするつもりだから、現状では時間がかかりすぎる。
何というミスなんだ!

そこで、任意のフォルダーから開始できるよう、初期画面SetSCNを追加することにした。

そこで画面遷移が必要となるわけだが、いろいろ参考資料を読んでいたら、どうもScreenManagerを使った方がいいみたいなので、早速修正したいと思う。
ここを参考にして(【初心者向け】KivyによるWindowsアプリ作成10 画面遷移の実装方法その1  http://www.closetoyou.jp/kivy/introduction-to-kivy10/)(2020-03-12現在リンク切れ) 現状のソースを変更する。
なお以降、ScreenManager上のnameとして、今まで作ってきたAllSCNには「all」と、新設するSetSCNには「Set」を指定する。
filelist.pyでは、AllSCNの親クラスを、BoxLayoutからScreenに変更。(後述するが、このBoxLayoutはkvファイル側に移設)
ScreenManagerのインスタンスsmを追加。それを、FilelistAppのbuildに「sm.add_widget(AllSCN(name='all'))」を追加。戻り値をsmに変更。


import os
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.popup import Popup
from kivy.uix.treeview import TreeViewLabel
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from pprint import pprint
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path
# 日本語フォント設定
resource_add_path('./fonts')
LabelBase.register(DEFAULT_FONT, 'ipaexg.ttf')
sm  = ScreenManager()
class LoadDialog(FloatLayout):
    load = ObjectProperty(None)
    cancel = ObjectProperty(None)
class AllSCN(Screen):
    tv = ObjectProperty(None)
    tree_fp = ObjectProperty(None)
    loadfile = ObjectProperty(None)
    text_input = ObjectProperty(None)
    (長ったらしいので、省略しますわよ)

class FilelistApp(App):
    def build(self):
        sm.add_widget(AllSCN(name='all'))
        return sm
if __name__ == '__main__':
    FilelistApp().run()

それでは、filelist.kvの方では、AllSCNのBoxLayoutをこちらへ持って行く。


<AllSCN>:
    BoxLayout:
        tv: tv
        tree_fp: tree_fp
        orientation: 'vertical'
        BoxLayout: #OpnSCN
            size_hint_y: 0.1
            TextInput:
                id: tree_fp
                size_hint_x: 0.8
                text: 'ファイルパス'
            Button:
                size_hint_x: 0.1
                text: '…'
                on_release: root.show_load()
            Button:
                size_hint_x: 0.1
                text: '実行'
     (また省略しますわよ)
AllSCN:

それで、実行しよう。

この画面が出て、確認OK。
では、設定画面を追加しよう。
とりあえず仮設なので、仮の画面にしておこう。
そして、新画面SetSCNの追加作業に移る。
filelist.pyでは、AllSCN上で新設する「設定」ボタンが押されたら、SetSCN(set)画面へ行くのだ。


import os
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.popup import Popup
from kivy.uix.treeview import TreeViewLabel
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from pprint import pprint
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path
# 日本語フォント設定
resource_add_path('./fonts')
LabelBase.register(DEFAULT_FONT, 'ipaexg.ttf')
sm  = ScreenManager()
class SetSCN(Screen):
    pass

lass LoadDialog(FloatLayout):
    load = ObjectProperty(None)
    cancel = ObjectProperty(None)
class AllSCN(Screen):
    tv = ObjectProperty(None)
    tree_fp = ObjectProperty(None)
    loadfile = ObjectProperty(None)
    text_input = ObjectProperty(None)
    def __init__(self, **kwargs):
         super(AllSCN, self).__init__(**kwargs)
    def setupButtonClicked(self):
        sm.current = 'set'

    (この間省略しますわよ。)

class FilelistApp(App):
    def build(self):
        sm.add_widget(AllSCN(name='all'))
        sm.add_widget(SetSCN(name='set'))
        return sm
if __name__ == '__main__':
    FilelistApp().run()

filelist.kvは、本当に仮の画面「えへへ」。
新設の「設定」ボタンが押されたら、AllSCN上のsetupButtonClickedを呼ぶようにする。


<SetSCN>
    BoxLayout:
        Label:
            text: 'えへへ'
<AllSCN>:
    BoxLayout:
        tv: tv
        tree_fp: tree_fp
        orientation: 'vertical'
        BoxLayout: #OpnSCN
            size_hint_y: 0.1
            Button:
                size_hint_x: 0.1
                text: '設定'
                on_release: root.setupButtonClicked()
            TextInput:
                id: tree_fp
                size_hint_x: 0.7
                text: 'ファイルパス'
            Button:
                size_hint_x: 0.1
                text: '…'
                on_release: root.show_load()
            Button:
                size_hint_x: 0.1
                text: '実行'
        BoxLayout: #ResultSCN
            size_hint_y: 0.9
            TreeView:
                id: tv
<LoadDialog>:
   (省略だわよ)
AllSCN:

実行すると、

「設定」ボタンを押すと、

設定画面の「えへへ」が無事に出力された。
そして、えへへ・・・じゃなかった設定画面にボタンをつけて、AllSCNにもどるか確認する。
filelist.py(全文)


import os
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.popup import Popup
from kivy.uix.treeview import TreeViewLabel
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from pprint import pprint
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path
# 日本語フォント設定
resource_add_path('./fonts')
LabelBase.register(DEFAULT_FONT, 'ipaexg.ttf')
sm  = ScreenManager()
class SetSCN(Screen):
    def okButtonClicked(self):
        sm.current = 'all'
    def cancelButtonClicked(self):
        sm.current = 'all'

class LoadDialog(FloatLayout):
    load = ObjectProperty(None)
    cancel = ObjectProperty(None)
class AllSCN(Screen):
    tv = ObjectProperty(None)
    tree_fp = ObjectProperty(None)
    loadfile = ObjectProperty(None)
    text_input = ObjectProperty(None)
    def __init__(self, **kwargs):
         super(AllSCN, self).__init__(**kwargs)
    def setupButtonClicked(self):
        sm.current = 'set'
    def show_load(self):
        content = LoadDialog(load = self.load, cancel = self.dismiss_popup)
        self._popup = Popup( title="読み込み中", content=content, size_hint=(0.9,0.9))
        self._popup.open()
    def load (self, path, filename):
        print(filename[0])
        self.tree_fp.text = filename[0]
        self.tv.add_node(TreeViewLabel(text ='あははは'))
        self.tv.add_node(TreeViewLabel(text ='いひひひ'))
        self.tv.add_node(TreeViewLabel(text ='うふふふ'))
        #with open (os.path.join(path, filename[0])) as stream:
        #    self.text_input.text = stream.read()
        self.dismiss_popup()
    def dismiss_popup(self):
        self._popup.dismiss()
class FilelistApp(App):
    def build(self):
        sm.add_widget(AllSCN(name='all'))
        sm.add_widget(SetSCN(name='set'))
        return sm
if __name__ == '__main__':
    FilelistApp().run()

filelist.kv


<SetSCN>
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            size_hint_y: 0.9
            Label:
                text: 'えへへ'
        BoxLayout:
            size_hint_y: 0.1
            Button:
                size_hint_x: 0.5
                text: 'OK'
                on_release: root.okButtonClicked()
            Button:
                size_hint_x: 0.5
                text: 'キャンセル'
                on_release: root.cancelButtonClicked()
<AllSCN>:
    BoxLayout:
        tv: tv
        tree_fp: tree_fp
        orientation: 'vertical'
        BoxLayout: #OpnSCN
            size_hint_y: 0.1
            Button:
                size_hint_x: 0.1
                text: '設定'
                on_release: root.setupButtonClicked()
            TextInput:
                id: tree_fp
                size_hint_x: 0.7
                text: 'ファイルパス'
            Button:
                size_hint_x: 0.1
                text: '…'
                on_release: root.show_load()
            Button:
                size_hint_x: 0.1
                text: '実行'
        BoxLayout: #ResultSCN
            size_hint_y: 0.9
            TreeView:
                id: tv
<LoadDialog>:
    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: 'vertical'
        FileChooserListView:
            id: filechooser
        BoxLayout:
            size_hint_y : None
            height : 30
            Button:
                text: 'キャンセル'
                on_release: root.cancel()
            Button:
                text: '読み込み'
                on_release: root.load(filechooser.path, filechooser.selection)
AllSCN:

これを実行すると、

ここで、「設定」を押して、

この画面が出たら、「キャンセル」を押して、

遷移の確認は、完了。

(2018-10-4追記)
ソースを見て気が付いたが、これではAllSCNでの「シンカリオン…」の表示がなく、「・・・」ボタン押下でFilechooserを作動させ、「読み込み」ボタンを押下させようとしたときに「あははは」「いひひひ」「うふふふ」をtree表示させようとしている(これはその前のprint文で落ちます)。
なぜ、こんなソースにしてしまったのか、今となっては不明。
おそらく、ScreenManagerで悩んでいた時に、心が乱れていたから、こんなソースになったのだろうと。
タイトルとURLをコピーしました