前提・実現したいこと
kivy初心者です。
名前と年齢のデータをrecycleviewで表示させ、checkboxで選択したものを削除できるようにしたいです。データを表示させることはできました。しかし、checkboxを組み込もうとするとエラーが出ます。
様々なサイト見て試してみましたがチェックボックスを画面に出すことができません。初心者なので優しく教えてくださるとうれしいです。
python3.7.3
発生している問題・エラーメッセージ
BuilderException: Parser: File "<inline>", line 20: ... 18: CheckBox: 19: size_hint_x: .1 >> 20: active:root.is_checked 21: on_press: 22: active = self.active ... AttributeError: 'Row' object has no attribute 'is_checked' File "C:\Users\pseadmin\Anaconda3\envs\kivy\lib\site-packages\kivy\lang\builder.py", line 242, in create_handler return eval(value, idmap), bound_list File "<string>", line 20, in <module> File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
該当のソースコード
python
1from string import ascii_lowercase 2from kivy.uix.checkbox import CheckBox 3from kivy.properties import StringProperty, BooleanProperty 4from kivy.app import App 5from kivy.lang import Builder 6from kivy.uix.boxlayout import BoxLayout 7from kivy.config import Config 8Config.set('graphics', 'fullscreen', 0) 9Config.set('graphics', 'width', 900) 10Config.set('graphics', 'height', 500) 11Config.set('graphics', 'resizable', 0) 12from kivy.core.text import LabelBase, DEFAULT_FONT 13from kivy.resources import resource_add_path 14resource_add_path('Fonts') 15LabelBase.register(DEFAULT_FONT, 'HGRMB.TTC') 16 17 18kv = """ 19<Row@BoxLayout>: 20 canvas.before: 21 Color: 22 rgba: 0.5, 0.5, 0.5, 1 23 Rectangle: 24 size: self.size 25 pos: self.pos 26 name: '' 27 age: '' 28 29 Label: 30 text: root.name 31 on_press: root.choose(self) 32 Label: 33 text: root.age 34 35 CheckBox: 36 size_hint_x: .1 37 active:root.is_checked 38 on_press: 39 active = self.active 40 root.is_checked = active 41 root.rv.data[root.get_view_index()]['is_checked'] = active 42 43<Test>: 44 canvas: 45 Color: 46 rgba: 0.3, 0.3, 0.3, 1 47 Rectangle: 48 size: self.size 49 pos: self.pos 50 rv: rv 51 orientation: 'vertical' 52 GridLayout: 53 cols: 2 54 rows: 2 55 size_hint_y: None 56 height: dp(108) 57 padding: dp(8) 58 spacing: dp(16) 59 Button: 60 text: '一覧表示' 61 on_press: root.alldata() 62 Button: 63 text: '保存' 64 on_press: root.save() 65 66 BoxLayout: 67 spacing: dp(8) 68 TextInput: 69 id: new_name_input 70 hint_text: '名前' 71 padding: dp(10), dp(10), 0, 0 72 73 TextInput: 74 id: new_age_input 75 hint_text: '年齢' 76 padding: dp(10), dp(10), 0, 0 77 78 BoxLayout: 79 spacing: dp(8) 80 Button: 81 text: '登録' 82 on_press: root.resister() 83 Button: 84 text: '削除' 85 on_press: root.remove() 86 87 Button: 88 text: '検索' 89 on_press: root.insert() 90 Button: 91 text: '編集' 92 on_press: edit 93 # on_press: root.edit() 94 RecycleView: 95 id: rv 96 scroll_type: ['bars', 'content'] 97 scroll_wheel_distance: dp(114) 98 bar_width: dp(10) 99 viewclass: 'Row' 100 RecycleBoxLayout: 101 default_size: None, dp(56) 102 default_size_hint: 1, None 103 size_hint_y: None 104 height: self.minimum_height 105 orientation: 'vertical' 106 spacing: dp(2) 107""" 108 109Builder.load_string(kv) 110 111 112class Test(BoxLayout): 113 114 def alldata(self): 115 self.rv.data=[] 116 self.rv.data.append({"name":"田中", "age":17,'is_checked': False,}) 117 118 119 def save(self): 120 pass 121 122 def resister(self): 123 pass 124 125 def remove(self): 126 self.rv.data = [record for record in rv.data if not record['is_checked']] 127 128 129 def insert(self): 130 pass 131 132 def edit(seif): 133 pass 134 135class Row(BoxLayout): 136 name = StringProperty() 137 age = StringProperty() 138 is_checked = BooleanProperty() 139 140 @property 141 def rv(self): 142 return self.parent.recycleview 143 144 def get_view_index(self): 145 return self.parent.get_view_index_at(self.center) 146 147 148class TestApp(App): 149 def build(self): 150 return Test() 151 152 153if __name__ == '__main__': 154 TestApp().run()
簡略化してあります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。