EV計算機を作る 完成 ⑤

被写体の明るさ(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は下記

見たり聞いたりして何とか出来ましたが、Tabが効かないのでspaceで代用故一寸心配。

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

from tkinter import *
import tkinter

# 定義
ISO_EV = {
“50”:1,
“100”:0,
“200”:-1,
“400”:-2,
“800”:-3,
“1600”:-4,
“3200”:-5,
“6400”:-6,
“12800”:-7,
“25600”:-8
}

F_EV = {
“1.4”: 1,
“2”: 2,
“2.8”: 3,
“4”: 4,
“5.6”: 5,
“8”: 6,
“11”: 7,
“16”: 8,
“22”: 9,
“32”: 10
}

T_EV = {
“30”: -5,
“15”: -4,
“8”: -3,
“4”: -2,
“2”: -1,
“1”: 0,
“1/2”: 1,
“1/4”: 2,
“1/8”: 3,
“1/15”: 4,
“1/30”: 5,
“1/60”: 6,
“1/125”: 7,
“1/250”: 8,
“1/500”: 9,
“1/1000”: 10,
“1/2000”: 11,
“1/4000”: 12,
“1/8000”: 13
}

# ISO, Fv, Tv が格納される変数
ISOv = 0
Fv = 0
Tv = 0
totalEV = 0

root = tkinter.Tk()
root.title(“kumasanのEV計算機”)
root.geometry(“275×400”)

label_iso = tkinter.Label(root, text=”ISO”, bg=”lightblue”)
label_iso.place(x=20, y=20)

label_f = tkinter.Label(root, text=”Aperture”, bg=”lightblue”)
label_f.place(x=95, y=20)

label_t = tkinter.Label(root, text=”Shutter Speed”, bg=”lightblue”)
label_t.place(x=180, y=20)

label_EV = tkinter.Label(root, text=”Total EV”, bg=”red”)
label_EV.place(x=20, y=280)

# ### EV表示用 ####
textbox_iso=tkinter.Entry(width=6)
textbox_iso.insert(tkinter.END,”ISO EV”)
textbox_iso.place(x=20 ,y=250)

textbox_f = tkinter.Entry(width=5)
textbox_f.insert(tkinter.END, “F EV”)
textbox_f.place(x=90, y=250)

textbox_t = tkinter.Entry(width=5)
textbox_t.insert(tkinter.END, “T EV”)
textbox_t.place(x=150, y=250)

textbox_EV = tkinter.Entry(width=10)
textbox_EV.insert(tkinter.END, “Total EV”)
textbox_EV.place(x=80, y=280)

label_ISO = tkinter.Label(root,text=”ISO値”, bg=”lightblue”)
label_ISO.place(x=20, y=220)

label_F = tkinter.Label(root, text=”F値”, bg=”lightblue”)
label_F.place(x=90, y=220)

label_T = tkinter.Label(root, text=”T値”, bg=”lightblue”)
label_T.place(x=150, y=220)

text = Text(root, width=23, height=4)
text.place(x=20, y= 320) # 文字数、自動折り返し:enterでCR/LF(略語?)

def edit_ev_text(totalEV):
    text.delete(‘1.0’, ‘end’)
    if totalEV <= -6:
        text.insert(‘end’, “暗すぎて普通の撮り方は出来ません.”)
    elif totalEV == -5:
        text.insert(‘end’, “-5EVは, 冬の天の川の明るさです. MFでピントを合わせて下さい.”)
    elif totalEV == -4:
        text.insert(‘end’, “-4EVは, 夏の天の川の明るさです. AFは多分利かないでしょう.”)
    elif totalEV == -3:
        text.insert(‘end’, “-3EVは, 闇夜のカラス状態です. AFが効かないかもしれません.”)
    elif totalEV == -2:
        text.insert(‘end’, “-2EVは, 星がやっと見える明るさです.”)
    elif totalEV == -1:
        text.insert(‘end’, “-1EVは, 星・水・波の流れを長時間露光で撮るような明るさです.”)
    elif totalEV == 0:
        text.insert(‘end’, “0EVは, 真夜中の住宅街の明るさです.”)
    elif totalEV == 1:
        text.insert(‘end’, “1EVは, 暗い住宅街の明るさです.”)
    elif totalEV == 2:
        text.insert(‘end’, “2EVは, 遠くの夜景の明るさです.”)
    elif totalEV == 3:
        text.insert(‘end’, “3EVは, 花火や暗い街灯がある程度の明るさです.”)
    elif totalEV == 4:
        text.insert(‘end’, “4EVは, 暗い室内・街灯のある夜景の明るさです.”)
    elif totalEV == 5:
        text.insert(‘end’, “5EVは, 夜景の明るさです.”)
    elif totalEV == 6:
        text.insert(‘end’, “6EVは, イルミネーション・夜の室内・電球下の明るさです.”)
    elif totalEV == 7:
        text.insert(‘end’, “7EVは, 夜の室内・蛍光灯・余り明るくない昼のオフィスの明るさです.”)
    elif totalEV == 8:
        text.insert(‘end’, “8EVは, 一寸明るい室内の明るさです.”)
    elif totalEV == 9:
        text.insert(‘end’, “9EVは, 可なり明るい室内です.”)
    elif totalEV == 10:
        text.insert(‘end’, “10EVは, 朝夕のマジックアワーの明るさです. 幻想的な写真にもってこいです.”)
    elif totalEV == 11:
        text.insert(‘end’, “11EVは, 雨曇り・晴れの夕方の明るさです.”)
    elif totalEV == 12:
        text.insert(‘end’, “12EVは, 日中の日陰・薄曇り・月表面の明るさです.”)
    elif totalEV == 13:
        text.insert(‘end’, “13EVは, 薄日・晴れの朝夕の明るさです.”)
    elif totalEV == 14:
        text.insert(‘end’, “14EVは, 晴れ・日中・郊外の明るさです.”)
    elif totalEV == 15:
        text.insert(‘end’, “15EVは, 夏・快晴・ビーチの明るさです.”)
    elif totalEV == 16:
        text.insert(‘end’, “16EVは, 快晴の山・海・雪・砂漠などの明るさです.”)
    elif totalEV == 17:
        text.insert(‘end’, “17EVは, 日の出・日の入りの太陽の明るさです. ファインダーで直接見るのは止めましょう.”)
    elif totalEV == 18:
        text.insert(‘end’, “18EVは, 太陽ギラギラの明るさです.”)
    elif totalEV == 19:
        text.insert(‘end’, “19EVは, カメラではこれ以上明るいと測光できません.”)
    elif totalEV == 20:
        text.insert(‘end’, “20EVは, これ以上明るいと測光できません.”)
    elif totalEV == 21:
        text.insert(‘end’, “21EVは, 計算上の明るさで, 意味ありません.”)
    elif totalEV == 22:
        text.insert(‘end’, “22EVは, 一般的な機器では測光できません.”)
    elif totalEV == 23:
        text.insert(‘end’, “23EVは, 一般的な機器では測光できません.”)


def show_item_ISO(event):
    # ISOv, Fv, Tv は関数の外で宣言した変数を使う
    global ISOv, Fv, Tv
    # リストクリック時に実行するメソッド
    item_index1 = listbox_ISO.curselection()

    if len(item_index1) >= 1:
        # ISO値 ISOv値を更新
        iso = listbox_ISO.get(item_index1)
        ISOv = ISO_EV[iso]

        # ラベルの更新
        label_ISO[“text”] = iso

        ################### ISOが変わったらISOvも自動で変わる###########
        textbox_iso.delete(0, tkinter.END)
        textbox_iso.insert(tkinter.END, ISOv)

        ################## ISOが変わったらTvも自動で変わる##############
        textbox_t.delete(0, tkinter.END)
        textbox_t.insert(tkinter.END, Tv)
        # totalEv値が変わったら説明を表示

        # Totalの更新
        textbox_EV.delete(0, tkinter.END)
        textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
        global totalEV
        totalEV = Fv + Tv + ISOv
        # print(totalEV)

        edit_ev_text(totalEV)

listbox_ISO = tkinter.Listbox(root, width=8, selectmode=”single”)
listbox_ISO.bind(“<<ListboxSelect>>”, show_item_ISO)
for item in ISO_EV.keys():
    listbox_ISO.insert(tkinter.END, item)
listbox_ISO.place(x=20, y=40)

def show_item_F(event):
    # ISO, Fv, Tv は関数の外で宣言した変数を使う
    global ISOv, Fv, Tv
    # リストクリック時に実行するメソッド
    item_index2 = listbox_F.curselection()

    if len(item_index2) >= 1:
        # F値 Fv値を更新
        f = listbox_F.get(item_index2)
        Fv = F_EV[f]

        # ラベルの更新
        label_F[“text”] = f

        # ################## Fが変わったらFvも自動で変わる##############
        textbox_f.delete(0, tkinter.END)
        textbox_f.insert(tkinter.END, Fv)

        # Totalの更新
        textbox_EV.delete(0, tkinter.END)
        textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)

        # ################## Fが変わったらTvも自動で変わる##############
        textbox_t.delete(0, tkinter.END)
        textbox_t.insert(tkinter.END, Tv)
        # totalEv値が変わったら説明を表示

        # Totalの更新
        textbox_EV.delete(0, tkinter.END)
        textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
        global totalEV
        totalEV = Fv + Tv + ISOv
        # print(totalEV)

        edit_ev_text(totalEV)

listbox_F = tkinter.Listbox(root, width=8, selectmode=”single”)
listbox_F.bind(“<<ListboxSelect>>”, show_item_F)
for item in F_EV.keys():
    listbox_F.insert(tkinter.END, item)
listbox_F.place(x=100, y=40)

def show_item_T(event):
    # ISOv, Fv, Tv は関数の外で宣言した変数を使う
    global ISO, Fv, Tv

    # リストクリック時に実行するメソッド
    item_index3 = listbox_T.curselection()

    if len(item_index3) >= 1:
        # T値 Tv値の更新
        t = listbox_T.get(item_index3)
        Tv = T_EV[t]

        # ラベルの更新
        label_T[“text”] = t   

        # ################## Tが変わったらTvも自動で変わる##############
        textbox_t.delete(0, tkinter.END)
        textbox_t.insert(tkinter.END, Tv)
        # totalEv値が変わったら説明を表示

        # Totalの更新
        textbox_EV.delete(0, tkinter.END)
        textbox_EV.insert(tkinter.END, Fv + Tv + ISOv)
        global totalEV
        totalEV = Fv + Tv + ISOv
        # print(totalEV)

        edit_ev_text(totalEV)

listbox_T = tkinter.Listbox(root, width=8, height=19, selectmode=”single”)
listbox_T.bind(“<<ListboxSelect>>”, show_item_T)
for item in T_EV.keys():
listbox_T.insert(tkinter.END, item)
listbox_T.place(x=192, y=40)


root.mainloop()

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

Python別館
Python 1年間のまとめ widget編 ⑮

Pythonの学習を初めてから約1年が過ぎました。 何もないところから始めたので、遅々として進歩しま …

Python別館
高齢者運転免許認知症テスト

最近は高齢者は3年に一度の認知症テストが有ります。 先日受けてきたのですが、確か次のようなテストが有 …

Python別館
Pythonファイルをexe化する ⑤

Pythonンプログラムを作っても、他人に渡す時はexeファイルにしないといけません。コマンドプロン …