質問するログイン新規登録

回答編集履歴

2

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

2018/01/20 21:22

投稿

umyu
umyu

スコア5846

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

追加

2018/01/20 21:22

投稿

umyu
umyu

スコア5846

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
+ とりとめのない回答になってしまいましたが、参考になればー。