前回(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ファイルの
このバグ、今なら原因がわかります。
あとで出てきますが、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は最初から指定なし)。
これは別のところで落ちるのですが、ここに気が付いていれば、別にソースをロールバックする必要はなかったのですが、当時はそこまで心の余裕がなかったというところが、実際のところです。