teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2021/07/02 12:51

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -17,4 +17,25 @@
17
17
 
18
18
  > layoutoのボタンと、同時にappendで作ったボタンリストでは、違ったものになってしまい、困っています…
19
19
 
20
- 具体的にどう違うんですか?`layout.children`と`appendで作ったボタンリスト`の中身の順番が逆だということならそれで正常です。
20
+ 具体的にどう違うんですか?`layout.children`と`appendで作ったボタンリスト`の中身の順番が逆だということならそれで正常です。
21
+
22
+ ### 追記:別のやり方
23
+
24
+ 現在のcodeではlambdaのdefault引数を利用してidを結びつけてますが、idをButtonの属性として書き込む手もあるので状況に応じて使い分けると良いと思います。
25
+
26
+ ```
27
+ def build(self):
28
+ layout = GridLayout(cols = yoko)
29
+ id = 0
30
+ for i in range(tate):
31
+ for j in range(yoko):
32
+ id += 1
33
+ button = Button(text=str(id), on_press=self.buttonClicked)
34
+ button.my_id = str(id)
35
+ layout.add_widget(button)
36
+ return layout
37
+
38
+ def buttonClicked(self, instance):
39
+ print(instance.my_id,"クリックした")
40
+ instance.enabled = False
41
+ ```

2

追記

2021/07/02 12:51

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -17,4 +17,4 @@
17
17
 
18
18
  > layoutoのボタンと、同時にappendで作ったボタンリストでは、違ったものになってしまい、困っています…
19
19
 
20
- 具体的にどう違うんですか?
20
+ 具体的にどう違うんですか?`layout.children`と`appendで作ったボタンリスト`の中身の順番が逆だということならそれで正常です。

1

追記

2021/07/02 10:18

投稿

gottadiveintopy
gottadiveintopy

スコア736

answer CHANGED
@@ -2,5 +2,19 @@
2
2
  - `layout = GridLayout(cols = yoko)`で作ったlayoutはどこにも繋がれていないので表示されないです。`親にしたいwidget.add_widget(layout)`として繋いであげてください。
3
3
  - `title`を持っているのは`App`classです。
4
4
  - lambdaの落とし穴に引っかかっているので[これ](https://docs.python.org/ja/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result)を読んでおくのを薦めます。
5
- - Buttonを無効にしたい時は`Buttonのinstance.enabled = False`です。
6
- - `on_press = lambda x: self.buttonClicked(str(id))`の`x`にButtonのinstanceが入ってます。
5
+ - Buttonを無効にしたい時は~~`Buttonのinstance.enabled = False`~~`Buttonのinstance.disabled = True`です。
6
+ - `on_press = lambda x: self.buttonClicked(str(id))`の`x`にButtonのinstanceが入ってます。
7
+
8
+ ### 追記:3番目のcommentへの返事
9
+
10
+ > instance.disabled = True にしたら、できました!書いていることは同じようでも、違うんですね…。
11
+
12
+ 英語の意味的に同じであれば何でも良いってわけじゃないので`disabled = True`を`enabled = False`に自由に置き換えたりはできないですね。因みにわからないことをどうやって調べてますか?今回のように`Button`を無効化したいのなら`kivy button disable`でググれば[答え](https://stackoverflow.com/a/19843015)がすぐに出てきますよ。
13
+
14
+ > また、引数を instance, n = id にしてみましたが ... 動作しませんでした。
15
+
16
+ もし`self.buttonClicked(n)`の部分がそのままであればそうなりますね。`buttonClicked()`の定義を見ると第二位置引数は`instance`となっているのでそこにはButtonのinstanceを渡さないといけないわけです。にも関わらず実際に渡しているのは`self.buttonClicked(n)`で分かる通り`n`という整数なので。
17
+
18
+ > layoutoのボタンと、同時にappendで作ったボタンリストでは、違ったものになってしまい、困っています…
19
+
20
+ 具体的にどう違うんですか?