回答編集履歴
2
サンプルコードを2種類ついか
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
追加
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
|
+
とりとめのない回答になってしまいましたが、参考になればー。
|