回答編集履歴
2
サンプルコードを2種類ついか
answer
CHANGED
@@ -98,4 +98,146 @@
|
|
98
98
|
|
99
99
|
なければ、[昔、別の質問で回答した感じ](https://teratail.com/questions/101712)の事をプログラムで作成して、
|
100
100
|
JSONファイルなどから読む形にするといいですよ。
|
101
|
-
とりとめのない回答になってしまいましたが、参考になればー。
|
101
|
+
とりとめのない回答になってしまいましたが、参考になればー。
|
102
|
+
|
103
|
+
---
|
104
|
+
質問文の編集ありがとうございました。以下のサンプルコードで希望する動作になりますかー?
|
105
|
+
|
106
|
+
サンプルコード1)元ソースをあまり変更しないタイプ
|
107
|
+
```Python
|
108
|
+
# -*- coding: UTF-8 -*
|
109
|
+
import tkinter as Tk
|
110
|
+
|
111
|
+
|
112
|
+
# ↓追加 ここから
|
113
|
+
def set_window_visible(window, visible):
|
114
|
+
if visible:
|
115
|
+
window.deiconify()
|
116
|
+
else:
|
117
|
+
window.withdraw()
|
118
|
+
# ↑追加 ここまで
|
119
|
+
|
120
|
+
|
121
|
+
class VolumeWindow:
|
122
|
+
|
123
|
+
def __init__(self, master):
|
124
|
+
# masterはFrame型
|
125
|
+
self.master = master
|
126
|
+
self.top = Tk.Toplevel(self.master)
|
127
|
+
self.f = Tk.Frame(self.top)
|
128
|
+
self.f.pack()
|
129
|
+
self.volume = Tk.IntVar()
|
130
|
+
self.volume.set(50)
|
131
|
+
self.volume_bar = Tk.Scale(self.f, orient='h',variable=self.volume)
|
132
|
+
self.volume_bar.pack()
|
133
|
+
set_window_visible(self.top, False)
|
134
|
+
#VolumeWindowウィンドウを閉じる時のイベントを追加
|
135
|
+
self.top.protocol('WM_DELETE_WINDOW', self.on_window_exit)
|
136
|
+
|
137
|
+
def on_window_exit(self):
|
138
|
+
# VolumeWindowウィンドウを閉じた時に呼ばれる処理
|
139
|
+
# Frame型の変数volume_buttonを設定
|
140
|
+
self.master.volume_button.configure(state=Tk.NORMAL)
|
141
|
+
# ボリュームウィンドウを非表示に
|
142
|
+
set_window_visible(self.top, False)
|
143
|
+
|
144
|
+
|
145
|
+
class Frame(Tk.Frame):
|
146
|
+
def __init__(self, master=None):
|
147
|
+
Tk.Frame.__init__(self, master)
|
148
|
+
self.f = Tk.Frame(self)
|
149
|
+
self.f.pack()
|
150
|
+
# 引数をFrameに変更
|
151
|
+
self.volume = VolumeWindow(self)
|
152
|
+
self.f_button = Tk.Frame(self.f)
|
153
|
+
self.f_button.pack()
|
154
|
+
self.volume_button = Tk.Button(self.f_button, text='Volume', command=self.control_volume, state=Tk.NORMAL)
|
155
|
+
self.volume_button.pack(padx=5, pady=5, side=Tk.LEFT)
|
156
|
+
|
157
|
+
def control_volume(self):
|
158
|
+
# make_windowはしない。ボリュームウィンドウを表示するだけ。
|
159
|
+
#self.volume.make_window()
|
160
|
+
set_window_visible(self.volume.top, True)
|
161
|
+
self.volume_button.configure(state=Tk.DISABLED)
|
162
|
+
|
163
|
+
|
164
|
+
if __name__ == '__main__':
|
165
|
+
f = Frame()
|
166
|
+
f.pack()
|
167
|
+
f.mainloop()
|
168
|
+
|
169
|
+
```
|
170
|
+
|
171
|
+
---
|
172
|
+
サンプルコード2)個人的な変更版
|
173
|
+
1,VolumeWindowをTk.Toplevelに変更して変数を削除
|
174
|
+
2,メイン画面のボタンが増えた時用にFrame#widgets_set_state関数を追加
|
175
|
+
|
176
|
+
```Python
|
177
|
+
# -*- coding: UTF-8 -*
|
178
|
+
import tkinter as Tk
|
179
|
+
|
180
|
+
|
181
|
+
# ↓追加
|
182
|
+
def set_window_visible(window, visible):
|
183
|
+
if visible:
|
184
|
+
window.deiconify()
|
185
|
+
else:
|
186
|
+
window.withdraw()
|
187
|
+
#
|
188
|
+
|
189
|
+
#Tk.Toplevelを継承するように変更
|
190
|
+
class VolumeWindow(Tk.Toplevel):
|
191
|
+
def __init__(self, master):
|
192
|
+
super().__init__(master)
|
193
|
+
self.f = Tk.Frame(self)
|
194
|
+
self.f.pack()
|
195
|
+
self.volume = Tk.IntVar()
|
196
|
+
self.volume.set(50)
|
197
|
+
self.volume_bar = Tk.Scale(self.f, orient='h',variable=self.volume)
|
198
|
+
self.volume_bar.pack()
|
199
|
+
set_window_visible(self, False)
|
200
|
+
#VolumeWindowウィンドウを閉じる時のイベントを追加
|
201
|
+
self.protocol('WM_DELETE_WINDOW', self.on_window_exit)
|
202
|
+
|
203
|
+
def on_window_exit(self):
|
204
|
+
# VolumeWindowウィンドウを閉じた時に呼ばれる処理
|
205
|
+
# 親ウィンドウのボタンを活性化
|
206
|
+
self.master.widgets_set_state(True)
|
207
|
+
# ボリュームウィンドウを非表示に
|
208
|
+
set_window_visible(self, False)
|
209
|
+
|
210
|
+
|
211
|
+
class Frame(Tk.Frame):
|
212
|
+
def __init__(self, master=None):
|
213
|
+
Tk.Frame.__init__(self, master)
|
214
|
+
self.f = Tk.Frame(self)
|
215
|
+
self.f.pack()
|
216
|
+
# 引数をFrameに変更
|
217
|
+
self.volume = VolumeWindow(self)
|
218
|
+
self.f_button = Tk.Frame(self.f)
|
219
|
+
self.f_button.pack()
|
220
|
+
self.volume_button = Tk.Button(self.f_button, text='Volume', command=self.control_volume, state=Tk.NORMAL)
|
221
|
+
self.volume_button.pack(padx=5, pady=5, side=Tk.LEFT)
|
222
|
+
|
223
|
+
def control_volume(self):
|
224
|
+
# make_windowはしない。ボリュームウィンドウを表示するだけ。
|
225
|
+
#self.volume.make_window()
|
226
|
+
set_window_visible(self.volume, True)
|
227
|
+
self.widgets_set_state(False)
|
228
|
+
|
229
|
+
def widgets_set_state(self, state):
|
230
|
+
if state:
|
231
|
+
self.volume_button.configure(state=Tk.NORMAL)
|
232
|
+
else:
|
233
|
+
self.volume_button.configure(state=Tk.DISABLED)
|
234
|
+
|
235
|
+
|
236
|
+
if __name__ == '__main__':
|
237
|
+
f = Frame()
|
238
|
+
f.pack()
|
239
|
+
f.mainloop()
|
240
|
+
|
241
|
+
|
242
|
+
```
|
243
|
+
個人的な意見としてはボリュームウィンドウを表示しても、別にメインウィンドウの操作を制限する必要はないのでは・・と思いますが。。
|
1
追加
answer
CHANGED
@@ -75,4 +75,27 @@
|
|
75
75
|
if __name__ == '__main__':
|
76
76
|
main()
|
77
77
|
|
78
|
-
```
|
78
|
+
```
|
79
|
+
|
80
|
+
---
|
81
|
+
コメント欄の質問を受けて追加
|
82
|
+
|
83
|
+
まず、Python言語自体が簡単なテストアプリならいいのですが、
|
84
|
+
本格的な画面(GUI)アプリケーション作成には向いていない言語だと個人的に思っています。
|
85
|
+
すぐに思いつく理由としては
|
86
|
+
・情報がtkinterのチュートリアルレベルで終わっている事が多い。
|
87
|
+
・他のGUIアプリを開発した事がある前提の情報が多い。
|
88
|
+
・日本語の情報が少なめ。
|
89
|
+
・体感 GUIアプリ開発者のユーザーが少なめ
|
90
|
+
|
91
|
+
どういうユーザーを対象にしてアプリケーションを作成しているのかが分かりませんが。
|
92
|
+
例えば、OSがWindowsならVisual Studio Communityを使ったアプリになるのでは。
|
93
|
+
|
94
|
+
あとはそのアプリに質問者様がどれだけの時間(作業工数)を掛けれるかでしょうか。
|
95
|
+
|
96
|
+
個人的には最低限、画面レイアウトをコードではなく、XMLやJSONで定義できるGUIツールキットを使ったほうが、
|
97
|
+
画面の定義に掛かる時間を短く出来ます。
|
98
|
+
|
99
|
+
なければ、[昔、別の質問で回答した感じ](https://teratail.com/questions/101712)の事をプログラムで作成して、
|
100
|
+
JSONファイルなどから読む形にするといいですよ。
|
101
|
+
とりとめのない回答になってしまいましたが、参考になればー。
|