回答編集履歴

4

補足を追加

2021/09/27 03:35

投稿

Daregada
Daregada

スコア11990

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

誤字を修正

2021/09/27 03:35

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -58,11 +58,11 @@
58
58
 
59
59
 
60
60
 
61
- 以下のコードでは、`lambda`という機能を使い、`lambda`の引数`x`に変数`app2`の値(ウィジェットオブクトのID)を代入することで、ガベージコレクションによる自動的な削除を回避しています。
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

誤字を修正

2021/09/26 00:54

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- サブウィンドウのウィジェットオブジェクトを利用するには、**変数`app2`にそれが代入された後**である必要があります。ここで、変数`app2`は関数`tk_new`内でのみ有効な**ローカル変数**なので、関数`tk_new`の処理から抜けると使えなくなります。
49
+ サブウィンドウのウィジェットオブジェクトを利用するには、**変数`app2`にそれが代入された後**である必要があります。ここで、変数`app2`は関数`new_tk`内でのみ有効な**ローカル変数**なので、関数`new_tk`の処理から抜けると使えなくなります。
50
50
 
51
51
 
52
52
 

1

補足を追加

2021/09/25 23:56

投稿

Daregada
Daregada

スコア11990

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