ここで問題が出た。

現状では、Rootフォルダーから検索となる。

TreeViewでツリー構造を一通り読み込ませる構造にするつもりだから、現状では時間がかかりすぎる。

何というミスなんだ!

 

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

そこで画面遷移が必要となるわけだが、いろいろ参考資料を読んでいたら、どうもScreenManagerを使った方がいいみたいなので、早速修正したいと思う。

ここを参考にして(【初心者向け】KivyによるWindowsアプリ作成10 画面遷移の実装方法その1  https://www.closetoyou.jp/kivy/introduction-to-kivy10/)現状のソースを変更する。

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()

そう、ScreenManagerではAllSCNを「all」で管理するのだ。

 

それでは、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。

では、設定画面を追加しよう。

とりあえず仮設なので、仮の画面にしておこう。

 

filelist.pyは、新画面SetSCNを追加。ScreenManager上での名前は「set」とする。

そして、AllSCN上で新設するボタンが押されたら、「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:

 

これを実行すると、

 

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

 

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

 

遷移の確認は、完了。