質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

(kivy)Recycleviewを使用した表におけるToggleButtonの挙動について

roshi10011
roshi10011

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0評価

0クリップ

4497閲覧

投稿2017/11/15 08:38

編集2017/11/15 08:40

###やりたいこと
kivyを使用したGUIにおいて、スクロールできる表を作成しています。
表のうち、いずれかのセルをクリックするとそのセルを含む行が選択された状態になり、再度クリックすることで画面遷移をしたいです。

###現状
Recycleviewを使用して表を作成し、表のセルをToggleButtonで表現しました。
ToggleButtonが押されたら、その行に含まれるToggleButtonの状態を変化されるように作っております。

###困っていること
Recycleviewで作成した表にToggleButtonを埋め込み、ボタンを押下したところ、意図しないボタンまで押下された状態になりました。
更に表を何回かスクロールしたところ、押下したボタンの状態が勝手に変化していることを確認しました。

これはkivy側の仕様なのでしょうか?

python

from random import sample from string import ascii_lowercase from kivy.app import App from kivy.lang import Builder from kivy.uix.boxlayout import BoxLayout kv = """ <Row@BoxLayout>: canvas.before: Color: rgba: 0.5, 0.5, 0.5, 1 Rectangle: size: self.size pos: self.pos value: '' ToggleButton: text: root.value <Test>: canvas: Color: rgba: 0.3, 0.3, 0.3, 1 Rectangle: size: self.size pos: self.pos rv: rv orientation: 'vertical' GridLayout: cols: 3 rows: 2 size_hint_y: None height: dp(108) padding: dp(8) spacing: dp(16) Button: text: 'Populate list' on_press: root.populate() Button: text: 'Sort list' on_press: root.sort() Button: text: 'Clear list' on_press: root.clear() BoxLayout: spacing: dp(8) Button: text: 'Insert new item' on_press: root.insert(new_item_input.text) TextInput: id: new_item_input size_hint_x: 0.6 hint_text: 'value' padding: dp(10), dp(10), 0, 0 BoxLayout: spacing: dp(8) Button: text: 'Update first item' on_press: root.update(update_item_input.text) TextInput: id: update_item_input size_hint_x: 0.6 hint_text: 'new value' padding: dp(10), dp(10), 0, 0 Button: text: 'Remove first item' on_press: root.remove() RecycleView: id: rv scroll_type: ['bars', 'content'] scroll_wheel_distance: dp(114) bar_width: dp(10) viewclass: 'Row' RecycleBoxLayout: default_size: None, dp(56) default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' spacing: dp(2) """ Builder.load_string(kv) class Test(BoxLayout): def populate(self): self.rv.data = [{'value': ''.join(sample(ascii_lowercase, 6))} for x in range(50)] def sort(self): self.rv.data = sorted(self.rv.data, key=lambda x: x['value']) def clear(self): self.rv.data = [] def insert(self, value): self.rv.data.insert(0, {'value': value or 'default value'}) def update(self, value): if self.rv.data: self.rv.data[0]['value'] = value or 'default new value' self.rv.refresh_from_data() def remove(self): if self.rv.data: self.rv.data.pop(0) class TestApp(App): def build(self): return Test() if __name__ == '__main__': TestApp().run()

kivyのサンプルプログラムより抜粋・一部変更あり

###備考
python: 3.4.2
kivy: 1.10.0

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。