回答編集履歴
4
補足を追加
answer
CHANGED
@@ -60,4 +60,30 @@
|
|
60
60
|
```diff
|
61
61
|
- but2 = tk.Button(text='quit', command=lambda x=app2: my_close(x))
|
62
62
|
+ but2 = tk.Button(app2, text='quit', command=lambda x=app2: my_close(x))
|
63
|
+
```
|
64
|
+
|
65
|
+
---
|
66
|
+
補足: 今回は
|
67
|
+
|
68
|
+
> pythonのtkで「command」で複数の関数を使いたい
|
69
|
+
|
70
|
+
という質問だったので、それに沿った回答になりましたが、「サブウィンドウをメインウィンドウと連動させて閉じたい」というだけなら、サブウィンドウを`Toplevel`で開くのが簡単です。
|
71
|
+
|
72
|
+
メインウィンドウが閉じるときにサブウィンドウが連動して閉じるため、`but2`の`command`には、メインウィンドウを閉じる関数オブジェクト`app.destroy`だけを指定すれば事足ります。
|
73
|
+
|
74
|
+
```Python
|
75
|
+
import tkinter as tk
|
76
|
+
|
77
|
+
|
78
|
+
def new_tk():
|
79
|
+
tk.Toplevel()
|
80
|
+
but2 = tk.Button(text='quit', command=app.destroy)
|
81
|
+
but2.place(x=100, y=100)
|
82
|
+
|
83
|
+
|
84
|
+
app = tk.Tk()
|
85
|
+
but = tk.Button(text='new', command=new_tk)
|
86
|
+
but.place(x=100, y=100)
|
87
|
+
|
88
|
+
app.mainloop()
|
63
89
|
```
|
3
誤字を修正
answer
CHANGED
@@ -28,9 +28,9 @@
|
|
28
28
|
|
29
29
|
これを避けるには、サブウィンドウもメインウィンドウと同様に関数の外側で生成してグローバル変数に入れる(あなたが自分で作るならこちらがわかりやすいでしょう)か、変数`app2`以外にもサブウィンドウのウィジェットオブジェクトへの参照を作ります。
|
30
30
|
|
31
|
-
以下のコードでは、`lambda`という機能を使い、`lambda`の引数`x`に変数`app2`の値(ウィジェットオブ
|
31
|
+
以下のコードでは、`lambda`という機能を使い、`lambda`の引数`x`に変数`app2`の値(ウィジェットオブジェクトのID)を代入することで、ガベージコレクションによる自動的な削除を回避しています。
|
32
32
|
|
33
|
-
そして、その引数`x`を指定した関数`my_close`を呼び出し、そこでサブウィンドウとメインウィンドウをそれぞれ`destroy`しています。
|
33
|
+
そして、`but2`のボタンを押すと、その引数`x`を指定した関数`my_close`を呼び出し、そこでサブウィンドウとメインウィンドウをそれぞれ`destroy`しています。
|
34
34
|
|
35
35
|
```Python
|
36
36
|
import tkinter as tk
|
2
誤字を修正
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
サブウィンドウのほうはちょっと複雑です。
|
24
24
|
|
25
|
-
サブウィンドウのウィジェットオブジェクトを利用するには、**変数`app2`にそれが代入された後**である必要があります。ここで、変数`app2`は関数`
|
25
|
+
サブウィンドウのウィジェットオブジェクトを利用するには、**変数`app2`にそれが代入された後**である必要があります。ここで、変数`app2`は関数`new_tk`内でのみ有効な**ローカル変数**なので、関数`new_tk`の処理から抜けると使えなくなります。
|
26
26
|
|
27
27
|
すると、変数`app2`だけが使っていたウィジェットオブジェクトはガベージコレクションにより自動的に削除されてしまいます。
|
28
28
|
|
1
補足を追加
answer
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
質問文のコードには複数の問題がありますが、おそらく**実際のコード**はこれと違っていて、質問に書かれた問題以外は動いているのでしょう。回答者は**実際のコード**を見ることができないのでわかりませんが。
|
2
|
+
補足: 削除線の部分は回答中に修正されました。
|
2
3
|
|
3
|
-
- 先頭の`tkinetr`は`tkinter`の誤り
|
4
|
+
- ~~先頭の`tkinetr`は`tkinter`の誤り~~
|
4
5
|
- `place`で各ボタンの位置を(100, 200)に設定しているが、tkinterで生成されるウィンドウのサイズの初期値は200x200なので、**ボタンがウィンドウ内に表示されない**
|
5
|
-
- ボタンのテキストを設定するオプション引数は`text`であって、`label`ではない
|
6
|
+
- ~~ボタンのテキストを設定するオプション引数は`text`であって、`label`ではない~~
|
6
7
|
- `app`に対して`mainloop`を呼び出していないため、**メインウィンドウが表示されない**。
|
7
8
|
|
8
9
|
これらを修正すると、質問文のコードが動くようになり、質問の状況が再現できます。
|