いよいよfilelist.pyの本題。いままでは仮に「シンカリオン」何たらで埋めていたこの部分を実装する。

 

で、前回同様この部分を独立させてテストロジックをつくっていたら、画面が出ない!

 

 

で、2日ほど悩んでいて、こういうことに気がついた。

kv19c.py

 


from kivy.app import App
from kivy.lang import Builder

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.treeview import TreeViewLabel
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivy.clock import Clock

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

Builder.load_string('''
<ResultParts>:
    tv_p: tv_v

    BoxLayout:
        TreeView:
            id: tv_v

<TestSCN>:
    #ResultParts:
''')


class ResultParts(BoxLayout):
    tv_p = ObjectProperty(None)

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

        # AllSCNのtree処理
        self.tv_p.add_node(TreeViewLabel(text='シンカリオン E1 とき'))
        self.tv_p.add_node(TreeViewLabel(text='シンカリオン 0 ひかり'))
        self.tv_p.add_node(TreeViewLabel(text='シンカリオン キハ32 鉄道ホビートレイン'))


class TestSCN(Screen):

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

        self.add_widget(ResultParts())


class TestApp(App):
    def build(self):
        sm.add_widget(TestSCN(name='test'))

        return sm

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

 

treeを表示する ResultParts(かつてのResultSCNと同じ)なんだけど、これを呼び出すのには、TestSCN自体がTestAppで、


class TestApp(App):
    def build(self):
        sm.add_widget(TestSCN(name='test'))

        return sm

screenmanager管理になっているので、TestSCNでは、


class TestSCN(Screen):

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

        self.add_widget(ResultParts())

として、TestSCN自身にadd_widgetをかけるのが正解なんですね。

こんなことを考えていて、時間がかかってしまった。

 

そういうわけで、表示が出ました。

 

つまり未だに、自分自身にこびりついた手続き型のコーディングの発想でいたから、オブジェクト指向のコーディングがなかなか発想できなかったわけですね、、、、、、