下記のさんぷるこーどについてですが、主にTestクラス内の処理のタイミングにおいて
このような形で記入すればkivy側でアクションを起こすことで(on_press等の)実行できることはわかりました。
例えばpopulate関数の処理をon_press時ではなく、読み込み時に処理させたいと思い試してみました。
試した内容としてはkivy側で定義した"rv"をpython側で取得するため"rv = ObjectProperty(None)"にて試みましたが、data属性がないため実行できないと怒られました。
こういった関数内の処理を画面表示時に実行するにはどのように書けばよいでしょうか?
python
1from random import sample 2from string import ascii_lowercase 3from kivy.config import Config 4Config.set('graphics', 'width', '600') 5Config.set('graphics', 'height', '560') 6from kivy.app import App 7from kivy.lang import Builder 8from kivy.uix.boxlayout import BoxLayout 9 10 11kv = """ 12<Row@BoxLayout>: 13 canvas.before: 14 Color: 15 rgba: 0.5, 0.5, 0.5, 1 16 Rectangle: 17 size: self.size 18 pos: self.pos 19 value: '' 20 Label: 21 text: root.value 22<Test>: 23 canvas: 24 Color: 25 rgba: 0.3, 0.3, 0.3, 1 26 Rectangle: 27 size: self.size 28 pos: self.pos 29 rv: rv 30 orientation: 'vertical' 31 GridLayout: 32 cols: 3 33 rows: 2 34 size_hint_y: None 35 height: dp(108) 36 padding: dp(8) 37 spacing: dp(16) 38 Button: 39 text: 'Populate list' 40 on_release: root.populate() 41 Button: 42 text: 'Sort list' 43 on_press: root.sort() 44 Button: 45 text: 'Clear list' 46 on_press: root.clear() 47 BoxLayout: 48 spacing: dp(8) 49 Button: 50 text: 'Insert new item' 51 on_press: root.insert(new_item_input.text) 52 TextInput: 53 id: new_item_input 54 size_hint_x: 0.6 55 hint_text: 'value' 56 padding: dp(10), dp(10), 0, 0 57 BoxLayout: 58 spacing: dp(8) 59 Button: 60 text: 'Update first item' 61 on_press: root.update(update_item_input.text) 62 TextInput: 63 id: update_item_input 64 size_hint_x: 0.6 65 hint_text: 'new value' 66 padding: dp(10), dp(10), 0, 0 67 Button: 68 text: 'Remove first item' 69 on_press: root.remove() 70 RecycleView: 71 id: rv 72 scroll_type: ['bars', 'content'] 73 scroll_wheel_distance: dp(114) 74 bar_width: dp(10) 75 viewclass: 'Row' 76 RecycleBoxLayout: 77 default_size: None, dp(56) 78 default_size_hint: 1, None 79 size_hint_y: None 80 height: self.minimum_height 81 orientation: 'vertical' 82 spacing: dp(2) 83""" 84 85Builder.load_string(kv) 86 87 88 89class Test(BoxLayout): 90 91 def populate(self): 92 self.rv.data = [{'value': ''.join(sample(ascii_lowercase, 6))}for x in range(5)] 93 94 def sort(self): 95 self.rv.data = sorted(self.rv.data, key=lambda x: x['value']) 96 97 def clear(self): 98 self.rv.data = [] 99 100 def insert(self, value): 101 self.rv.data.insert(0, {'value': value or 'default value'}) 102 103 def update(self, value): 104 if self.rv.data: 105 self.rv.data[0]['value'] = value or 'default new value' 106 self.rv.refresh_from_data() 107 108 def remove(self): 109 if self.rv.data: 110 self.rv.data.pop(0) 111 112 113class TestApp(App): 114 def build(self): 115 return Test() 116 117 118if __name__ == '__main__': 119 TestApp().run()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。