kivy

kivy戦記(13-1) 強敵ObjectPropertyの復活

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

前回(kivy戦記(12) 画面遷移 https://koh-sen.jp/blog/archives/7195)から、次のミッションを実行するために修正していたら、恐るべきミスが発覚した!
なんと、ファイル選択をすると、ブチ落ちるのだ。



このときの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
        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:

で、いろいろ調べたら、filelist.pyの中のclass AllSCN(Screen):の下にある、各種ObjectProperty群に値が入っていないことが判明した。
これは前回散々悩んだ、「kivy戦記(9-3) 強敵ObjectProperty(None)との勝利」(https://koh-sen.jp/blog/archives/7121) で登場するのだが、、、
この解決方法は、ロジックをシンプルにして、状況を打開する、と言うものであった。
ここまで作り込んだ現状では、この手段がやりにくい。
そこで、一つ決断をした。
「kivy戦記(11) ファイル選択」(https://koh-sen.jp/blog/archives/7187)までロールバックするしよう。
では、ロールバックだぁぁぁぁぁぁぁぁぁぁ!!!!
ぎゅおおおおおおおおおおおおおおおおんんんんん!!!(ロールバックの音)
こうして、私は、過去の世界に舞い降りたのであった。(続く)

(2018-10-4追記)
このバグ、今なら原因がわかります。
あとで出てきますが、kvファイルの

<AllSCN>:
    BoxLayout:
        tv: tv
        tree_fp: tree_fp
        orientation: 'vertical'

とするところを、

<AllSCN>:
    tv: tv
    tree_fp: tree_fp
    BoxLayout:
        orientation: 'vertical'

とすれば、tvとtree_fpには値が入るんですね。(loadfileとtext_inputは最初から指定なし)。
これは別のところで落ちるのですが、ここに気が付いていれば、別にソースをロールバックする必要はなかったのですが、当時はそこまで心の余裕がなかったというところが、実際のところです。

タイトルとURLをコピーしました