###やりたいこと
kivyを使用したGUIにおいて、スクロールできる表を作成しています。
表のうち、いずれかのセルをクリックするとそのセルを含む行が選択された状態になり、再度クリックすることで画面遷移をしたいです。
###現状
Recycleviewを使用して表を作成し、表のセルをToggleButtonで表現しました。
ToggleButtonが押されたら、その行に含まれるToggleButtonの状態を変化されるように作っております。
###困っていること
Recycleviewで作成した表にToggleButtonを埋め込み、ボタンを押下したところ、意図しないボタンまで押下された状態になりました。
更に表を何回かスクロールしたところ、押下したボタンの状態が勝手に変化していることを確認しました。
これはkivy側の仕様なのでしょうか?
python
1from random import sample 2from string import ascii_lowercase 3 4from kivy.app import App 5from kivy.lang import Builder 6from kivy.uix.boxlayout import BoxLayout 7 8 9kv = """ 10<Row@BoxLayout>: 11 canvas.before: 12 Color: 13 rgba: 0.5, 0.5, 0.5, 1 14 Rectangle: 15 size: self.size 16 pos: self.pos 17 value: '' 18 ToggleButton: 19 text: root.value 20 21<Test>: 22 canvas: 23 Color: 24 rgba: 0.3, 0.3, 0.3, 1 25 Rectangle: 26 size: self.size 27 pos: self.pos 28 rv: rv 29 orientation: 'vertical' 30 GridLayout: 31 cols: 3 32 rows: 2 33 size_hint_y: None 34 height: dp(108) 35 padding: dp(8) 36 spacing: dp(16) 37 Button: 38 text: 'Populate list' 39 on_press: root.populate() 40 Button: 41 text: 'Sort list' 42 on_press: root.sort() 43 Button: 44 text: 'Clear list' 45 on_press: root.clear() 46 BoxLayout: 47 spacing: dp(8) 48 Button: 49 text: 'Insert new item' 50 on_press: root.insert(new_item_input.text) 51 TextInput: 52 id: new_item_input 53 size_hint_x: 0.6 54 hint_text: 'value' 55 padding: dp(10), dp(10), 0, 0 56 BoxLayout: 57 spacing: dp(8) 58 Button: 59 text: 'Update first item' 60 on_press: root.update(update_item_input.text) 61 TextInput: 62 id: update_item_input 63 size_hint_x: 0.6 64 hint_text: 'new value' 65 padding: dp(10), dp(10), 0, 0 66 Button: 67 text: 'Remove first item' 68 on_press: root.remove() 69 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 88class Test(BoxLayout): 89 90 def populate(self): 91 self.rv.data = [{'value': ''.join(sample(ascii_lowercase, 6))} 92 for x in range(50)] 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()
kivyのサンプルプログラムより抜粋・一部変更あり
###備考
python: 3.4.2
kivy: 1.10.0

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 00:41