質問編集履歴

2

追加

2021/01/18 05:41

投稿

person
person

スコア223

test CHANGED
File without changes
test CHANGED
@@ -292,7 +292,7 @@
292
292
 
293
293
  継承先クラス Sub のコンストラクタ __init__() の定義が無いと、
294
294
 
295
- 継承元クラス Toplevel のコンストラクタ __init__() が呼ばれる。
295
+ Sub() インスタンス生成時に継承元クラス Toplevel のコンストラクタ __init__() が呼ばれる。
296
296
 
297
297
  Sub() インスタンス生成時に継承元のコンストラクタが呼ばれると困るので、
298
298
 

1

追加

2021/01/18 05:41

投稿

person
person

スコア223

test CHANGED
File without changes
test CHANGED
@@ -161,3 +161,199 @@
161
161
  main()
162
162
 
163
163
  ```
164
+
165
+
166
+
167
+ # 追記
168
+
169
+ teamikl様より修正して意図した結果になったソースコード
170
+
171
+ ```Python:
172
+
173
+ from tkinter import ttk
174
+
175
+ import tkinter as tk
176
+
177
+
178
+
179
+ class Main(tk.Tk):
180
+
181
+ def __init__(self):
182
+
183
+ super().__init__()
184
+
185
+ self.sub = Sub()
186
+
187
+ self.geometry("400x300+0+0")
188
+
189
+ self.title("main")
190
+
191
+ self.sub.open(self) # ← 書かなくてもToplevelウィンドウが表示される(?)
192
+
193
+
194
+
195
+ class Sub(tk.Toplevel):
196
+
197
+ def open(self, master):
198
+
199
+ self.geometry("200x200+25+25")
200
+
201
+ self.title("sub")
202
+
203
+ self.attributes("-topmost", True)
204
+
205
+ self.grab_set()
206
+
207
+ self.transient(master)
208
+
209
+ self.protocol("WM_DELETE_WINDOW", self.close)
210
+
211
+
212
+
213
+ def close(self):
214
+
215
+ self.grab_release()
216
+
217
+ self.destroy()
218
+
219
+
220
+
221
+ def main():
222
+
223
+ app = Main()
224
+
225
+ app.mainloop()
226
+
227
+
228
+
229
+ if __name__ == "__main__":
230
+
231
+ main()
232
+
233
+ ```
234
+
235
+
236
+
237
+ ボタン押下でToplevelを開くように個人的に変えたプログラム
238
+
239
+ ```Python:
240
+
241
+ from tkinter import ttk
242
+
243
+ import tkinter as tk
244
+
245
+
246
+
247
+ """
248
+
249
+ Frame を継承するのが一般的(?)だが、
250
+
251
+ Frame を生成・配置する必要はないので、Tk を継承する
252
+
253
+ """
254
+
255
+ class Main(tk.Tk):
256
+
257
+ def __init__(self):
258
+
259
+ # Tk のコンストラクタ呼び出し
260
+
261
+ super().__init__()
262
+
263
+ # Sub のインスタンス生成(ここではToplevelウィンドウは表示しない)
264
+
265
+ self.sub = Sub()
266
+
267
+ # Tk の設定
268
+
269
+ self.geometry("400x300+0+0")
270
+
271
+ self.title("main")
272
+
273
+ # Tk にウィジェット配置
274
+
275
+ self.button = ttk.Button(self, text="open", command=self.pushed)
276
+
277
+ self.button.grid()
278
+
279
+
280
+
281
+ def pushed(self):
282
+
283
+ # open 呼び出しにより、Toplevelウィンドウを生成
284
+
285
+ self.sub.open(self)
286
+
287
+
288
+
289
+ class Sub(tk.Toplevel):
290
+
291
+ """
292
+
293
+ 継承先クラス Sub のコンストラクタ __init__() の定義が無いと、
294
+
295
+ 継承元クラス Toplevel のコンストラクタ __init__() が呼ばれる。
296
+
297
+ Sub() インスタンス生成時に継承元のコンストラクタが呼ばれると困るので、
298
+
299
+ コンストラクタ(処理としては「何もしない」)を定義する。
300
+
301
+
302
+
303
+ 上記対応により継承元のコンストラクタを呼ばなくなったため、
304
+
305
+ super().__init__() を別の関数(open)に書くことで、
306
+
307
+ そのタイミングで継承元のコンストラクタを呼び出す。
308
+
309
+ """
310
+
311
+ def __init__(self):
312
+
313
+ pass
314
+
315
+ def open(self, master):
316
+
317
+ # Toplevel のコンストラクタ呼び出し(ここでToplevelウィンドウを表示する)
318
+
319
+ super().__init__()
320
+
321
+ # Toplevel の設定
322
+
323
+ self.geometry("200x200+25+25")
324
+
325
+ self.title("sub")
326
+
327
+ self.attributes("-topmost", True)
328
+
329
+ self.grab_set()
330
+
331
+ self.transient(master)
332
+
333
+ self.focus_set()
334
+
335
+ self.protocol("WM_DELETE_WINDOW", self.close)
336
+
337
+
338
+
339
+ def close(self):
340
+
341
+ self.grab_release()
342
+
343
+ self.destroy()
344
+
345
+
346
+
347
+ def main():
348
+
349
+ app = Main()
350
+
351
+ app.mainloop()
352
+
353
+
354
+
355
+ if __name__ == "__main__":
356
+
357
+ main()
358
+
359
+ ```