回答編集履歴
4
補足を追加
test
CHANGED
@@ -123,3 +123,55 @@
|
|
123
123
|
+ but2 = tk.Button(app2, text='quit', command=lambda x=app2: my_close(x))
|
124
124
|
|
125
125
|
```
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
---
|
130
|
+
|
131
|
+
補足: 今回は
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
> pythonのtkで「command」で複数の関数を使いたい
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
という質問だったので、それに沿った回答になりましたが、「サブウィンドウをメインウィンドウと連動させて閉じたい」というだけなら、サブウィンドウを`Toplevel`で開くのが簡単です。
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
メインウィンドウが閉じるときにサブウィンドウが連動して閉じるため、`but2`の`command`には、メインウィンドウを閉じる関数オブジェクト`app.destroy`だけを指定すれば事足ります。
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
```Python
|
148
|
+
|
149
|
+
import tkinter as tk
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
def new_tk():
|
156
|
+
|
157
|
+
tk.Toplevel()
|
158
|
+
|
159
|
+
but2 = tk.Button(text='quit', command=app.destroy)
|
160
|
+
|
161
|
+
but2.place(x=100, y=100)
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
app = tk.Tk()
|
168
|
+
|
169
|
+
but = tk.Button(text='new', command=new_tk)
|
170
|
+
|
171
|
+
but.place(x=100, y=100)
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
app.mainloop()
|
176
|
+
|
177
|
+
```
|
3
誤字を修正
test
CHANGED
@@ -58,11 +58,11 @@
|
|
58
58
|
|
59
59
|
|
60
60
|
|
61
|
-
以下のコードでは、`lambda`という機能を使い、`lambda`の引数`x`に変数`app2`の値(ウィジェットオブ
|
61
|
+
以下のコードでは、`lambda`という機能を使い、`lambda`の引数`x`に変数`app2`の値(ウィジェットオブジェクトのID)を代入することで、ガベージコレクションによる自動的な削除を回避しています。
|
62
62
|
|
63
63
|
|
64
64
|
|
65
|
-
そして、その引数`x`を指定した関数`my_close`を呼び出し、そこでサブウィンドウとメインウィンドウをそれぞれ`destroy`しています。
|
65
|
+
そして、`but2`のボタンを押すと、その引数`x`を指定した関数`my_close`を呼び出し、そこでサブウィンドウとメインウィンドウをそれぞれ`destroy`しています。
|
66
66
|
|
67
67
|
|
68
68
|
|
2
誤字を修正
test
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
-
サブウィンドウのウィジェットオブジェクトを利用するには、**変数`app2`にそれが代入された後**である必要があります。ここで、変数`app2`は関数`
|
49
|
+
サブウィンドウのウィジェットオブジェクトを利用するには、**変数`app2`にそれが代入された後**である必要があります。ここで、変数`app2`は関数`new_tk`内でのみ有効な**ローカル変数**なので、関数`new_tk`の処理から抜けると使えなくなります。
|
50
50
|
|
51
51
|
|
52
52
|
|
1
補足を追加
test
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
質問文のコードには複数の問題がありますが、おそらく**実際のコード**はこれと違っていて、質問に書かれた問題以外は動いているのでしょう。回答者は**実際のコード**を見ることができないのでわかりませんが。
|
2
|
+
|
3
|
+
補足: 削除線の部分は回答中に修正されました。
|
2
4
|
|
3
5
|
|
4
6
|
|
5
|
-
- 先頭の`tkinetr`は`tkinter`の誤り
|
7
|
+
- ~~先頭の`tkinetr`は`tkinter`の誤り~~
|
6
8
|
|
7
9
|
- `place`で各ボタンの位置を(100, 200)に設定しているが、tkinterで生成されるウィンドウのサイズの初期値は200x200なので、**ボタンがウィンドウ内に表示されない**
|
8
10
|
|
9
|
-
- ボタンのテキストを設定するオプション引数は`text`であって、`label`ではない
|
11
|
+
- ~~ボタンのテキストを設定するオプション引数は`text`であって、`label`ではない~~
|
10
12
|
|
11
13
|
- `app`に対して`mainloop`を呼び出していないため、**メインウィンドウが表示されない**。
|
12
14
|
|