回答編集履歴

2

サンプルコードを2種類ついか

2018/01/20 21:22

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -199,3 +199,287 @@
199
199
  JSONファイルなどから読む形にするといいですよ。
200
200
 
201
201
  とりとめのない回答になってしまいましたが、参考になればー。
202
+
203
+
204
+
205
+ ---
206
+
207
+ 質問文の編集ありがとうございました。以下のサンプルコードで希望する動作になりますかー?
208
+
209
+
210
+
211
+ サンプルコード1)元ソースをあまり変更しないタイプ
212
+
213
+ ```Python
214
+
215
+ # -*- coding: UTF-8 -*
216
+
217
+ import tkinter as Tk
218
+
219
+
220
+
221
+
222
+
223
+ # ↓追加 ここから
224
+
225
+ def set_window_visible(window, visible):
226
+
227
+ if visible:
228
+
229
+ window.deiconify()
230
+
231
+ else:
232
+
233
+ window.withdraw()
234
+
235
+ # ↑追加 ここまで
236
+
237
+
238
+
239
+
240
+
241
+ class VolumeWindow:
242
+
243
+
244
+
245
+ def __init__(self, master):
246
+
247
+ # masterはFrame型
248
+
249
+ self.master = master
250
+
251
+ self.top = Tk.Toplevel(self.master)
252
+
253
+ self.f = Tk.Frame(self.top)
254
+
255
+ self.f.pack()
256
+
257
+ self.volume = Tk.IntVar()
258
+
259
+ self.volume.set(50)
260
+
261
+ self.volume_bar = Tk.Scale(self.f, orient='h',variable=self.volume)
262
+
263
+ self.volume_bar.pack()
264
+
265
+ set_window_visible(self.top, False)
266
+
267
+ #VolumeWindowウィンドウを閉じる時のイベントを追加
268
+
269
+ self.top.protocol('WM_DELETE_WINDOW', self.on_window_exit)
270
+
271
+
272
+
273
+ def on_window_exit(self):
274
+
275
+ # VolumeWindowウィンドウを閉じた時に呼ばれる処理
276
+
277
+ # Frame型の変数volume_buttonを設定
278
+
279
+ self.master.volume_button.configure(state=Tk.NORMAL)
280
+
281
+ # ボリュームウィンドウを非表示に
282
+
283
+ set_window_visible(self.top, False)
284
+
285
+
286
+
287
+
288
+
289
+ class Frame(Tk.Frame):
290
+
291
+ def __init__(self, master=None):
292
+
293
+ Tk.Frame.__init__(self, master)
294
+
295
+ self.f = Tk.Frame(self)
296
+
297
+ self.f.pack()
298
+
299
+ # 引数をFrameに変更
300
+
301
+ self.volume = VolumeWindow(self)
302
+
303
+ self.f_button = Tk.Frame(self.f)
304
+
305
+ self.f_button.pack()
306
+
307
+ self.volume_button = Tk.Button(self.f_button, text='Volume', command=self.control_volume, state=Tk.NORMAL)
308
+
309
+ self.volume_button.pack(padx=5, pady=5, side=Tk.LEFT)
310
+
311
+
312
+
313
+ def control_volume(self):
314
+
315
+ # make_windowはしない。ボリュームウィンドウを表示するだけ。
316
+
317
+ #self.volume.make_window()
318
+
319
+ set_window_visible(self.volume.top, True)
320
+
321
+ self.volume_button.configure(state=Tk.DISABLED)
322
+
323
+
324
+
325
+
326
+
327
+ if __name__ == '__main__':
328
+
329
+ f = Frame()
330
+
331
+ f.pack()
332
+
333
+ f.mainloop()
334
+
335
+
336
+
337
+ ```
338
+
339
+
340
+
341
+ ---
342
+
343
+ サンプルコード2)個人的な変更版
344
+
345
+ 1,VolumeWindowをTk.Toplevelに変更して変数を削除
346
+
347
+ 2,メイン画面のボタンが増えた時用にFrame#widgets_set_state関数を追加
348
+
349
+
350
+
351
+ ```Python
352
+
353
+ # -*- coding: UTF-8 -*
354
+
355
+ import tkinter as Tk
356
+
357
+
358
+
359
+
360
+
361
+ # ↓追加
362
+
363
+ def set_window_visible(window, visible):
364
+
365
+ if visible:
366
+
367
+ window.deiconify()
368
+
369
+ else:
370
+
371
+ window.withdraw()
372
+
373
+ #
374
+
375
+
376
+
377
+ #Tk.Toplevelを継承するように変更
378
+
379
+ class VolumeWindow(Tk.Toplevel):
380
+
381
+ def __init__(self, master):
382
+
383
+ super().__init__(master)
384
+
385
+ self.f = Tk.Frame(self)
386
+
387
+ self.f.pack()
388
+
389
+ self.volume = Tk.IntVar()
390
+
391
+ self.volume.set(50)
392
+
393
+ self.volume_bar = Tk.Scale(self.f, orient='h',variable=self.volume)
394
+
395
+ self.volume_bar.pack()
396
+
397
+ set_window_visible(self, False)
398
+
399
+ #VolumeWindowウィンドウを閉じる時のイベントを追加
400
+
401
+ self.protocol('WM_DELETE_WINDOW', self.on_window_exit)
402
+
403
+
404
+
405
+ def on_window_exit(self):
406
+
407
+ # VolumeWindowウィンドウを閉じた時に呼ばれる処理
408
+
409
+ # 親ウィンドウのボタンを活性化
410
+
411
+ self.master.widgets_set_state(True)
412
+
413
+ # ボリュームウィンドウを非表示に
414
+
415
+ set_window_visible(self, False)
416
+
417
+
418
+
419
+
420
+
421
+ class Frame(Tk.Frame):
422
+
423
+ def __init__(self, master=None):
424
+
425
+ Tk.Frame.__init__(self, master)
426
+
427
+ self.f = Tk.Frame(self)
428
+
429
+ self.f.pack()
430
+
431
+ # 引数をFrameに変更
432
+
433
+ self.volume = VolumeWindow(self)
434
+
435
+ self.f_button = Tk.Frame(self.f)
436
+
437
+ self.f_button.pack()
438
+
439
+ self.volume_button = Tk.Button(self.f_button, text='Volume', command=self.control_volume, state=Tk.NORMAL)
440
+
441
+ self.volume_button.pack(padx=5, pady=5, side=Tk.LEFT)
442
+
443
+
444
+
445
+ def control_volume(self):
446
+
447
+ # make_windowはしない。ボリュームウィンドウを表示するだけ。
448
+
449
+ #self.volume.make_window()
450
+
451
+ set_window_visible(self.volume, True)
452
+
453
+ self.widgets_set_state(False)
454
+
455
+
456
+
457
+ def widgets_set_state(self, state):
458
+
459
+ if state:
460
+
461
+ self.volume_button.configure(state=Tk.NORMAL)
462
+
463
+ else:
464
+
465
+ self.volume_button.configure(state=Tk.DISABLED)
466
+
467
+
468
+
469
+
470
+
471
+ if __name__ == '__main__':
472
+
473
+ f = Frame()
474
+
475
+ f.pack()
476
+
477
+ f.mainloop()
478
+
479
+
480
+
481
+
482
+
483
+ ```
484
+
485
+ 個人的な意見としてはボリュームウィンドウを表示しても、別にメインウィンドウの操作を制限する必要はないのでは・・と思いますが。。

1

追加

2018/01/20 21:22

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -153,3 +153,49 @@
153
153
 
154
154
 
155
155
  ```
156
+
157
+
158
+
159
+ ---
160
+
161
+ コメント欄の質問を受けて追加
162
+
163
+
164
+
165
+ まず、Python言語自体が簡単なテストアプリならいいのですが、
166
+
167
+ 本格的な画面(GUI)アプリケーション作成には向いていない言語だと個人的に思っています。
168
+
169
+ すぐに思いつく理由としては
170
+
171
+ ・情報がtkinterのチュートリアルレベルで終わっている事が多い。
172
+
173
+ ・他のGUIアプリを開発した事がある前提の情報が多い。
174
+
175
+ ・日本語の情報が少なめ。
176
+
177
+ ・体感 GUIアプリ開発者のユーザーが少なめ
178
+
179
+
180
+
181
+ どういうユーザーを対象にしてアプリケーションを作成しているのかが分かりませんが。
182
+
183
+ 例えば、OSがWindowsならVisual Studio Communityを使ったアプリになるのでは。
184
+
185
+
186
+
187
+ あとはそのアプリに質問者様がどれだけの時間(作業工数)を掛けれるかでしょうか。
188
+
189
+
190
+
191
+ 個人的には最低限、画面レイアウトをコードではなく、XMLやJSONで定義できるGUIツールキットを使ったほうが、
192
+
193
+ 画面の定義に掛かる時間を短く出来ます。
194
+
195
+
196
+
197
+ なければ、[昔、別の質問で回答した感じ](https://teratail.com/questions/101712)の事をプログラムで作成して、
198
+
199
+ JSONファイルなどから読む形にするといいですよ。
200
+
201
+ とりとめのない回答になってしまいましたが、参考になればー。