EV計算機を作る 完成 ⑤ 1/28/2020 修正追記

被写体の明るさ(EV)計算機を作る④の続き

やっと完成しました。

巷には沢山同種のアプリがありますが、今回は脳内革命を兼ねてAIアプリで人気のあるPythonで作りました。

目玉は、
・ISO、絞り値、シャッター速度(ISO・F・T)を選ぶと、即明るさが計算されてその説明が表示されます。
・その光景では明るすぎたり暗すぎると思ったら、作画意思に基づきISO・F・Tを選びな直せます。
・ISO、F、Tを選ぶとそのEV値が表示されますので、それぞれの値とEV値の関係が分かると思います。
・-6EVより暗くなると、普通は写真が撮れませんので「暗くて撮れません」と表示されます。

① 立ち上げ時のアプリ画面

 

 

 

 

 

 

 

 

② 実例

 iso=400、F=5.6、T=1/250 ===> 被写体の明るさ(EV)=11となります。
 そしてEV11の説明として、「11EVは, 雨曇り・晴れの夕方の明るさです.」と表示されます。

 

 

 

 

 

 

 

 

③ 実例(いじわる設定)
  暗いところではどうなるか?

 

  ---> 暗くて撮れませ~ん。

 

 

 

 

 

 

 

 

 

 

④ 下記は完成したcodeです。 1/28/2020追記

取敢えずは見たり聞いたりして何とか完成しましたが、かなり冗長なものになりました。 もう少し上達したらクラスなどを使って更に簡便な物にしたいと思っております。

このサイト(theme)のタブが効かずスコープ(変数の適用範囲)が適切に表示できませんでしたので、今回は半角3桁数字+半角space2個をcodeの前に入れて見た目(scopeも)を整えました。各行の先頭の半角5文字(空白込)を取り除けば正しく動作します。

もしコピペするのでしたらこのcodeを全て下までcopyし、エクセルのA列に張り付けます、次にB1に =RIGHT(A1,LEN(A1)-5) と式を入れて下の「507  root.mainloop()」までcopyします。 そうすれば、頭初の数字とスペースが消えてタブも正常な位置にきますので動作するようになります。 確認してます。

蛇足:どうして行番号が101から始まっているかですか?
   それは1から始めるとB1に書く式が面倒になるので、一律行頭の5桁を削除することにしたためです。

 

******************************************

101  #EV計算機3.py 7/21/2019
102  
103  from tkinter import messagebox
104  from tkinter import *
105  import tkinter
106  
107  if __name__ == “__main__”:
108      # 定義
109      ISO_EV = {
110          “50”:1,
111          “100”:0,
112          “200”:-1,
113          “400”:-2,
114          “800”:-3,
115          “1600”:-4,
116          “3200”:-5,
117          “6400”:-6,
118          “12800”:-7,
119          “25600”:-8
120      }   
121  
122      F_EV = {
123          “1.4”: 1,
124          “2”: 2,
125          “2.8”: 3,
126          “4”: 4,
127          “5.6”: 5,
128          “8”: 6,
129          “11”: 7,
130          “16”: 8,
131          “22”: 9,
132          “32”: 10
133      }
134      
135      T_EV = {
136          “30”: -5,
137          “15”: -4,
138          “8”: -3,
139          “4”: -2,
140          “2”: -1,
141          “1”: 0,
142          “1/2”: 1,
143          “1/4”: 2,
144          “1/8”: 3,
145          “1/15”: 4,
146          “1/30”: 5,
147          “1/60”: 6,
148          “1/125”: 7,
149          “1/250”: 8,
150          “1/500”: 9,
151          “1/1000”: 10,
152          “1/2000”: 11,
153          “1/4000”: 12,
154          “1/8000”: 13
155      }
156  
157      #ISO, Fv, Tv が格納される変数
158      ISOv = 0
159      Fv = 0
160      Tv = 0
161  
162      root = tkinter.Tk()
163      root.title(“kumasanのEV計算機”)
164      root.geometry(“275×400”)
165      
166      label_iso = tkinter.Label(root, text=”①ISO”, bg=”lightblue”)
167      label_iso.place(x=20, y=20)
168      
169      label_f = tkinter.Label(root, text=”②Aperture”, bg=”lightblue”)
170      label_f.place(x=95, y=20)
171      
172      label_t = tkinter.Label(root, text=”③Shutter Speed”, bg=”lightblue”)
173      label_t.place(x=180, y=20)
174  
175      label_EV = tkinter.Label(root, text=”Total EV”, bg=”red”)
176      label_EV.place(x=20, y=280)
177  
178      #### EV表示用 ####
179      textbox_iso=tkinter.Entry(width=6)
180      textbox_iso.insert(tkinter.END,”ISO EV”)
181      textbox_iso.place(x=20 ,y=250)
182  
183      textbox_f = tkinter.Entry(width=5)
184      textbox_f.insert(tkinter.END, “F EV”)
185      textbox_f.place(x=90, y=250)
186  
187      textbox_t = tkinter.Entry(width=5)
188      textbox_t.insert(tkinter.END, “T EV”)
189      textbox_t.place(x=150, y=250)
190  
191      textbox_EV = tkinter.Entry(width=10)
192      textbox_EV.insert(tkinter.END, “Total EV”)
193      textbox_EV.place(x=80, y=280)
194  
195      label_ISO = tkinter.Label(root,text=”ISO値”, bg=”lightblue”)
196      label_ISO.place(x=20, y=220)
197  
198      label_F = tkinter.Label(root, text=”F値”, bg=”lightblue”)
199      label_F.place(x=90, y=220)
200  
201      label_T = tkinter.Label(root, text=”T値”, bg=”lightblue”)
202      label_T.place(x=150, y=220)
203      
204  
205      text = Text(root, width=23, height=4)
206      text.place(x=20, y= 320) #文字数、自動折り返し:enterでCR/LF(略語?)
207      
208  
209      def show_item_ISO(event):
210          # ISOv, Fv, Tv は関数の外で宣言した変数を使う
211          global ISOv, Fv, Tv
212          #リストクリック時に実行するメソッド
213          item_index1 = listbox_ISO.curselection()
214  
215          if len(item_index1) >= 1:
216          #ISO値 ISOv値を更新
217              iso = listbox_ISO.get(item_index1)
218              ISOv = ISO_EV[iso]
219  
220              # ラベルの更新
221              label_ISO[“text”] = iso
222  
223              ################### ISOが変わったらISOvも自動で変わる##############
224              textbox_iso.delete(0, tkinter.END)
225              textbox_iso.insert(tkinter.END, ISOv)
226  
227              ####################################################################
228  
229              ################### ISOが変わったらTvも自動で変わる##############
230              textbox_t.delete(0, tkinter.END)
231              textbox_t.insert(tkinter.END, Tv)
232              #totalEv値が変わったら説明を表示
233  
234              # Totalの更新
235              textbox_EV.delete(0, tkinter.END)
236              textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
237              totalEV=Fv + Tv + ISOv
238              print(totalEV)
239              
240              text.delete(‘1.0’, ‘end’)
241              
242              if totalEV == -5:
243                  text.insert(‘end’, “-5EVは, 冬の天の川の明るさです. MFでピントを合わせて下さい.”)
244              elif totalEV == -4:
245                  text.insert(‘end’, “-4EVは, 夏の天の川の明るさです. AFは多分利かないでしょう.”)
246              elif totalEV == -3:
247                  text.insert(‘end’, “-3EVは, 闇夜のカラス状態です. AFが効かないかもしれません.”)
248              elif totalEV == -2:
249                  text.insert(‘end’, “-2EVは, 星がやっと見える明るさです.”)
250              elif totalEV == -1:
251                  text.insert(‘end’, “-1EVは, 星・水・波の流れを長時間露光で撮るような明るさです.”)
252              elif totalEV == 0:
253                  text.insert(‘end’, “0EVは, 真夜中の住宅街の明るさです.”)
254              elif totalEV == 1:
255                  text.insert(‘end’, “1EVは, 暗い住宅街の明るさです.”)
256              elif totalEV == 2:
257                  text.insert(‘end’, “2EVは, 遠くの夜景の明るさです.”)
258              elif totalEV == 3:
259                  text.insert(‘end’, “3EVは, 花火や暗い街灯がある程度の明るさです.”)
260              elif totalEV == 4:
261                  text.insert(‘end’, “4EVは, 暗い室内・街灯のある夜景の明るさです.”)
262              elif totalEV == 5:
263                  text.insert(‘end’, “5EVは, 夜景の明るさです.”)
264              elif totalEV == 6:
265                  text.insert(‘end’, “6EVは, イルミネーション・夜の室内・電球下の明るさです.”)
266              elif totalEV == 7:
267                  text.insert(‘end’, “7EVは, 夜の室内・蛍光灯・余り明るくない昼のオフィスの明るさです.”)
268              elif totalEV == 8:
269                  text.insert(‘end’, “8EVは, 一寸明るい室内の明るさです.”)
270              elif totalEV == 9:
271                  text.insert(‘end’, “9EVは, 可なり明るい室内です.”)
272              elif totalEV == 10:
273                  text.insert(‘end’, “10EVは, 朝夕のマジックアワーの明るさです. 幻想的な写真にもってこいです.”)
274              elif totalEV == 11:
275                  text.insert(‘end’, “11EVは, 雨曇り・晴れの夕方の明るさです.”)
276              elif totalEV == 12:
277                  text.insert(‘end’, “12EVは, 日中の日陰・薄曇り・月表面の明るさです.”)
278              elif totalEV == 13:
279                  text.insert(‘end’, “13EVは, 薄日・晴れの朝夕の明るさです.”)
280              elif totalEV == 14:
281                  text.insert(‘end’, “14EVは, 晴れ・日中・郊外の明るさです.”)
282              elif totalEV == 15:
283                  text.insert(‘end’, “15EVは, 夏・快晴・ビーチの明るさです.”)
284              elif totalEV == 16:
285                  text.insert(‘end’, “16EVは, 快晴の山・海・雪・砂漠などの明るさです.”)
286              elif totalEV == 17:
287                  text.insert(‘end’, “17EVは, 日の出・日の入りの太陽の明るさです. ファインダーで直接見るのは止めましょう.”)
288              elif totalEV == 18:
289                  text.insert(‘end’, “18EVは, 太陽ギラギラの明るさです.”)
290              elif totalEV == 19:
291                  text.insert(‘end’, “19EVは, カメラではこれ以上明るいと測光できません.”)
292              elif totalEV == 20:
293                  text.insert(‘end’, “20EVは, これ以上明るいと測光できません.”)
294              elif totalEV == 21:
295                  text.insert(‘end’, “21EVは, 計算上の明るさで,意味ありません.”)
296              elif totalEV == 22:
297                  text.insert(‘end’, “22EVは, 一般的な機器では測光できません.”)
298              elif totalEV == 23:
299                  text.insert(‘end’, “23EVは, 一般的な機器では測光できません.”)
300              ####################################################################    
301  
302      listbox_ISO = tkinter.Listbox(root, width=8, selectmode=”single”)
303      listbox_ISO.bind(“<<ListboxSelect>>”, show_item_ISO)
304      for item in ISO_EV.keys():
305          listbox_ISO.insert(tkinter.END, item)
306      listbox_ISO.place(x=20, y=40)
307      
308      def show_item_F(event):
309          # ISO, Fv, Tv は関数の外で宣言した変数を使う
310          global ISOv, Fv, Tv
311          #リストクリック時に実行するメソッド
312          item_index2 = listbox_F.curselection()
313  
314          if len(item_index2) >= 1:
315              # F値 Fv値を更新
316              f = listbox_F.get(item_index2)
317              Fv = F_EV[f]
318  
319              # ラベルの更新
320              label_F[“text”] = f
321  
322              ################### Fが変わったらFvも自動で変わる##############
323              textbox_f.delete(0, tkinter.END)
324              textbox_f.insert(tkinter.END, Fv)
325  
326              # Totalの更新
327              textbox_EV.delete(0, tkinter.END)
328              textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
329  
330              ####################################################################
331  
332              ################### Fが変わったらTvも自動で変わる##############
333              textbox_t.delete(0, tkinter.END)
334              textbox_t.insert(tkinter.END, Tv)
335              #totalEv値が変わったら説明を表示
336  
337              # Totalの更新
338              textbox_EV.delete(0, tkinter.END)
339              textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
340              totalEV=Fv + Tv + ISOv
341              print(totalEV)
342              
343              text.delete(‘1.0’, ‘end’)
344              
345              if totalEV == -5:
346                  text.insert(‘end’, “-5EVは, 冬の天の川の明るさです. MFでピントを合わせて下さい.”)
347              elif totalEV == -4:
348                  text.insert(‘end’, “-4EVは, 夏の天の川の明るさです. AFは多分利かないでしょう.”)
349              elif totalEV == -3:
350                  text.insert(‘end’, “-3EVは, 闇夜のカラス状態です. AFが効かないかもしれません.”)
351              elif totalEV == -2:
352                  text.insert(‘end’, “-2EVは, 星がやっと見える明るさです.”)
353              elif totalEV == -1:
354                  text.insert(‘end’, “-1EVは, 星・水・波の流れを長時間露光で撮るような明るさです.”)
355              elif totalEV == 0:
356                  text.insert(‘end’, “0EVは, 真夜中の住宅街の明るさです.”)
357              elif totalEV == 1:
358                  text.insert(‘end’, “1EVは, 暗い住宅街の明るさです.”)
359              elif totalEV == 2:
360                  text.insert(‘end’, “2EVは, 遠くの夜景の明るさです.”)
361              elif totalEV == 3:
362                  text.insert(‘end’, “3EVは, 花火や暗い街灯がある程度の明るさです.”)
363              elif totalEV == 4:
364                  text.insert(‘end’, “4EVは, 暗い室内・街灯のある夜景の明るさです.”)
365              elif totalEV == 5:
366                  text.insert(‘end’, “5EVは, 夜景の明るさです.”)
367              elif totalEV == 6:
368                  text.insert(‘end’, “6EVは, イルミネーション・夜の室内・電球下の明るさです.”)
369              elif totalEV == 7:
370                  text.insert(‘end’, “7EVは, 夜の室内・蛍光灯・余り明るくない昼のオフィスの明るさです.”)
371              elif totalEV == 8:
372                  text.insert(‘end’, “8EVは, 一寸明るい室内の明るさです.”)
373              elif totalEV == 9:
374                  text.insert(‘end’, “9EVは, 可なり明るい室内です.”)
375              elif totalEV == 10:
376                  text.insert(‘end’, “10EVは, 朝夕のマジックアワーの明るさです. 幻想的な写真にもってこいです.”)
377              elif totalEV == 11:
378                  text.insert(‘end’, “11EVは, 雨曇り・晴れの夕方の明るさです.”)
379              elif totalEV == 12:
380                  text.insert(‘end’, “12EVは, 日中の日陰・薄曇り・月表面の明るさです.”)
381              elif totalEV == 13:
382                  text.insert(‘end’, “13EVは, 薄日・晴れの朝夕の明るさです.”)
383              elif totalEV == 14:
384                  text.insert(‘end’, “14EVは, 晴れ・日中・郊外の明るさです.”)
385              elif totalEV == 15:
386                  text.insert(‘end’, “15EVは, 夏・快晴・ビーチの明るさです.”)
387              elif totalEV == 16:
388                  text.insert(‘end’, “16EVは, 快晴の山・海・雪・砂漠などの明るさです.”)
389              elif totalEV == 17:
390                  text.insert(‘end’, “17EVは, 日の出・日の入りの太陽の明るさです. ファインダーで直接見るのは止めましょう.”)
391              elif totalEV == 18:
392                  text.insert(‘end’, “18EVは, 太陽ギラギラの明るさです.”)
393              elif totalEV == 19:
394                  text.insert(‘end’, “19EVは, カメラではこれ以上明るいと測光できません.”)
395              elif totalEV == 20:
396                  text.insert(‘end’, “20EVは, これ以上明るいと測光できません.”)
397              elif totalEV == 21:
398                  text.insert(‘end’, “21EVは, 計算上の明るさで,意味ありません.”)
399              elif totalEV == 22:
400                  text.insert(‘end’, “22EVは, 一般的な機器では測光できません.”)
401              elif totalEV == 23:
402                  text.insert(‘end’, “23EVは, 一般的な機器では測光できません.”)
403              ####################################################################    
404  
405      listbox_F = tkinter.Listbox(root, width=8, selectmode=”single”)
406      listbox_F.bind(“<<ListboxSelect>>”, show_item_F)
407      for item in F_EV.keys():
408          listbox_F.insert(tkinter.END, item)
409      listbox_F.place(x=100, y=40)
410      
411      def show_item_T(event):
412          # ISOv, Fv, Tv は関数の外で宣言した変数を使う
413          global ISO, Fv, Tv
414  
415          #リストクリック時に実行するメソッド
416          item_index3 = listbox_T.curselection()
417  
418          if len(item_index3) >= 1:
419              # T値 Tv値の更新
420              t = listbox_T.get(item_index3)
421              Tv = T_EV[t]
422  
423              # ラベルの更新
424              label_T[“text”] = t
425  
426              ####################################################################
427  
428              ################### Tが変わったらTvも自動で変わる##############
429              textbox_t.delete(0, tkinter.END)
430              textbox_t.insert(tkinter.END, Tv)
431              #totalEv値が変わったら説明を表示
432  
433              # Totalの更新
434              textbox_EV.delete(0, tkinter.END)
435              textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
436              totalEV=Fv + Tv + ISOv
437              print(totalEV)
438              
439              text.delete(‘1.0’, ‘end’)
440              
441              if totalEV == -5:
442                  text.insert(‘end’, “-5EVは, 冬の天の川の明るさです. MFでピントを合わせて下さい.”)
443              elif totalEV == -4:
444                  text.insert(‘end’, “-4EVは, 夏の天の川の明るさです. AFは多分利かないでしょう.”)
445              elif totalEV == -3:
446                  text.insert(‘end’, “-3EVは, 闇夜のカラス状態です. AFが効かないかもしれません.”)
447              elif totalEV == -2:
448                  text.insert(‘end’, “-2EVは, 星がやっと見える明るさです.”)
449              elif totalEV == -1:
450                  text.insert(‘end’, “-1EVは, 星・水・波の流れを長時間露光で撮るような明るさです.”)
451              elif totalEV == 0:
452                  text.insert(‘end’, “0EVは, 真夜中の住宅街の明るさです.”)
453              elif totalEV == 1:
454                  text.insert(‘end’, “1EVは, 暗い住宅街の明るさです.”)
455              elif totalEV == 2:
456                  text.insert(‘end’, “2EVは, 遠くの夜景の明るさです.”)
457              elif totalEV == 3:
458                  text.insert(‘end’, “3EVは, 花火や暗い街灯がある程度の明るさです.”)
459              elif totalEV == 4:
460                  text.insert(‘end’, “4EVは, 暗い室内・街灯のある夜景の明るさです.”)
461              elif totalEV == 5:
462                  text.insert(‘end’, “5EVは, 夜景の明るさです.”)
463              elif totalEV == 6:
464                  text.insert(‘end’, “6EVは, イルミネーション・夜の室内・電球下の明るさです.”)
465              elif totalEV == 7:
466                  text.insert(‘end’, “7EVは, 夜の室内・蛍光灯・余り明るくない昼のオフィスの明るさです.”)
467              elif totalEV == 8:
468                  text.insert(‘end’, “8EVは, 一寸明るい室内の明るさです.”)
469              elif totalEV == 9:
470                  text.insert(‘end’, “9EVは, 可なり明るい室内です.”)
471              elif totalEV == 10:
472                  text.insert(‘end’, “10EVは, 朝夕のマジックアワーの明るさです. 幻想的な写真にもってこいです.”)
473              elif totalEV == 11:
474                  text.insert(‘end’, “11EVは, 雨曇り・晴れの夕方の明るさです.”)
475              elif totalEV == 12:
476                  text.insert(‘end’, “12EVは, 日中の日陰・薄曇り・月表面の明るさです.”)
477              elif totalEV == 13:
478                  text.insert(‘end’, “13EVは, 薄日・晴れの朝夕の明るさです.”)
479              elif totalEV == 14:
480                  text.insert(‘end’, “14EVは, 晴れ・日中・郊外の明るさです.”)
481              elif totalEV == 15:
482                  text.insert(‘end’, “15EVは, 夏・快晴・ビーチの明るさです.”)
483              elif totalEV == 16:
484                  text.insert(‘end’, “16EVは, 快晴の山・海・雪・砂漠などの明るさです.”)
485              elif totalEV == 17:
486                  text.insert(‘end’, “17EVは, 日の出・日の入りの太陽の明るさです. ファインダーで直接見るのは止めましょう.”)
487              elif totalEV == 18:
488                  text.insert(‘end’, “18EVは, 太陽ギラギラの明るさです.”)
489              elif totalEV == 19:
490                  text.insert(‘end’, “19EVは, カメラではこれ以上明るいと測光できません.”)
491              elif totalEV == 20:
492                  text.insert(‘end’, “20EVは, これ以上明るいと測光できません.”)
493              elif totalEV == 21:
494                  text.insert(‘end’, “21EVは, 計算上の明るさで,意味ありません.”)
495              elif totalEV == 22:
496                  text.insert(‘end’, “22EVは, 一般的な機器では測光できません.”)
497              elif totalEV == 23:
498                  text.insert(‘end’, “23EVは, 一般的な機器では測光できません.”)
499              ####################################################################    
500  
501      listbox_T = tkinter.Listbox(root, width=8, height=19, selectmode=”single”)
502      listbox_T.bind(“<<ListboxSelect>>”, show_item_T)
503      for item in T_EV.keys():
504          listbox_T.insert(tkinter.END, item)
505      listbox_T.place(x=192, y=40)
506  

507  root.mainloop()

 

*******************************************

 

 

 

 

 

 

Python別館
Python別館 目次

・Pythonで作成したアプリ関連の記事は「Python別館」に、・widgetやその使用方法・それ …

カメラ別館
カメラ別館 目次 

2020年・秋の花 彼岸花・フィルムシミュレーション・モードで撮る・猛暑寸景・カメラとアプリで多重露 …

Python別館
Python検定試験準備 Q37

Python検定試験と云うのがあるらしいと別項に上げましたが、学習して損することは無いので始めて見ま …