回答編集履歴

4

コードの修正

2020/11/16 08:12

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -5,6 +5,10 @@
5
5
 
6
6
 
7
7
  ```python
8
+
9
+ import tkinter as tk
10
+
11
+
8
12
 
9
13
  def btn_click(event):
10
14
 
@@ -14,11 +18,19 @@
14
18
 
15
19
 
16
20
 
17
- buttonA = tk.Button(root, text="A")
18
21
 
19
- buttonA.bind("<ButtonRelease-1>", btn_click)
20
22
 
23
+ if __name__ == "__main__":
24
+
25
+ root = tk.Tk()
26
+
27
+ button = tk.Button(root, text="A")
28
+
29
+ button.bind("<ButtonRelease-1>", btn_click)
30
+
21
- buttonA.pack()
31
+ button.pack()
32
+
33
+ root.mainloop()
22
34
 
23
35
  ```
24
36
 
@@ -40,7 +52,7 @@
40
52
 
41
53
  但し、ボタン毎に関数と引数を関連付けしたオブジェクトを作る事になる為、
42
54
 
43
- 簡潔さでいうと bind を使った方が良いです。
55
+ 簡潔さでいうと (可能な場合は) bind を使った方が良いです。
44
56
 
45
57
 
46
58
 
@@ -54,23 +66,25 @@
54
66
 
55
67
 
56
68
 
57
- root = tk.Tk()
58
-
59
69
  def btn_click(button):
60
70
 
61
71
  print(button["text"])
62
72
 
63
73
 
64
74
 
65
- for text in ["A", "B", "C"]:
66
75
 
76
+
77
+ if __name__ == "__main__":
78
+
79
+ root = tk.Tk()
80
+
67
- button = tk.Button(root, text=text)
81
+ button = tk.Button(root, text="A")
68
82
 
69
83
  button["command"] = partial(btn_click, button)
70
84
 
71
85
  button.pack()
72
86
 
73
- root.mainloop()
87
+ root.mainloop()
74
88
 
75
89
  ```
76
90
 

3

コード修正

2020/11/16 08:12

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -110,8 +110,6 @@
110
110
 
111
111
  super().__init__(*args, **kwargs)
112
112
 
113
- self.config(command=self.onclick)
114
-
115
113
 
116
114
 
117
115
  def onclick(self): # インスタンス経由でアクセス
@@ -128,6 +126,8 @@
128
126
 
129
127
  button = MyButton(root, text="A")
130
128
 
129
+ button["command"] = button.onclick
130
+
131
131
  button.pack()
132
132
 
133
133
  root.mainloop()

2

追記: 他の方法2: サブクラスを利用する

2020/11/16 08:08

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -76,8 +76,6 @@
76
76
 
77
77
 
78
78
 
79
- ----
80
-
81
79
  NG: CANNOT ... コンストラクタで command を登録する時点ではインスタンスは生成されてない
82
80
 
83
81
 
@@ -87,3 +85,51 @@
87
85
  button = tk.Button(root, text="A", command=functools.partial(btn_click, button))
88
86
 
89
87
  ```
88
+
89
+
90
+
91
+ ----
92
+
93
+ 他の方法2: サブクラスを利用する
94
+
95
+
96
+
97
+ クラスを用いた汎用的な解決策
98
+
99
+
100
+
101
+ ```python
102
+
103
+ import tkinter as tk
104
+
105
+
106
+
107
+ class MyButton(tk.Button):
108
+
109
+ def __init__(self, *args, **kwargs):
110
+
111
+ super().__init__(*args, **kwargs)
112
+
113
+ self.config(command=self.onclick)
114
+
115
+
116
+
117
+ def onclick(self): # インスタンス経由でアクセス
118
+
119
+ print(self["text"])
120
+
121
+
122
+
123
+
124
+
125
+ if __name__ == "__main__":
126
+
127
+ root = tk.Tk()
128
+
129
+ button = MyButton(root, text="A")
130
+
131
+ button.pack()
132
+
133
+ root.mainloop()
134
+
135
+ ```

1

コードの修正

2020/11/16 07:16

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -72,12 +72,18 @@
72
72
 
73
73
  root.mainloop()
74
74
 
75
+ ```
75
76
 
76
77
 
78
+
79
+ ----
80
+
77
- # NG: CANNOT ... コンストラクタで cpmmand を登録する時点ではインスタンスは生成されてない
81
+ NG: CANNOT ... コンストラクタで command を登録する時点ではインスタンスは生成されてない
82
+
83
+
84
+
85
+ ```python
78
86
 
79
87
  button = tk.Button(root, text="A", command=functools.partial(btn_click, button))
80
88
 
81
-
82
-
83
89
  ```