import subprocess
# from math import *
# from symbol import argument
from numpy import *
import tkinter as tk
import tkinter.font as tkFont
from PIL import Image, ImageTk
subprocess.run(["cls"], shell=True)

# Her laves beregningerne samt udskriften af resultaterne.


def beregn(event):
    global flag, A, B, C, D, E, F, G
    # Først omregnes inputfelterne til real-tal.
    albedo = float(input_albedo.get().lower())
    alfa = float(input_alfa.get().lower())
    beta = float(input_beta.get().lower())
    gamma = float(input_gamma.get().lower())
    delta = float(input_delta.get().lower())
    co2 = float(input_co2.get().lower())
    lum = float(input_lum.get().lower())
    d = float(input_afstand.get().lower())

    # Forcing beregnes. (Myhre et al, samt Kiehl & Trenberth.)
    # Kiehl & Trenberth sagde at CO0=363 ppm og T0=288 K.
    df = 20.577*log(co2/363.)
    sigma = 5.67e-8
    dT = .1846*df
    # Temperaturer beregnes. Absolut sorte legemer antages.
    # LTE antages ikke, og der inddrages energitransport ved termik og latent varme.
    f_eff = lum/(4.*3.14159265355*d**2)/4.*(1.-albedo)
    f_brt = (alfa+gamma/(1.-gamma)) * \
        (1.+gamma*beta*(1.-delta)/(1.-gamma))**(-1.)*f_eff
    f_atm = (f_brt-alfa*f_eff)/gamma
    T0 = (f_brt*(1.-delta)/sigma)**.25
    T = T0+dT
    f_brt = sigma*T**4/(1.-delta)
    f_atm = (f_brt-alfa*f_eff)/gamma
    # Herunder sørges der for, at der også er strålingsbalance i atmosfæren.
    beta = (f_eff-(1.-gamma)*f_atm)/((1.-delta)*f_brt)
    t_øvre = ((1.-gamma)*(f_atm)/sigma)**.25
    t_nedre = (gamma*(f_atm)/sigma)**.25
    t_overflade = ((1.-delta)/sigma*f_brt)**.25

    # Fluxer beregnes.
    f_a = alfa*f_eff
    f_b = (1.-alfa)*f_eff
    f_c = delta*f_brt
    f_d = (1.-beta)*(1.-delta)*f_brt
    f_e = beta*(1.-delta)*f_brt
    f_f = (1.-gamma)*(f_atm)
    f_g = gamma*(f_atm)

    # Fluxer skrives ind i billedvinduet første gang.
    if (flag == 0):
        A = bldramme.create_text(190, 400, text=str(
            f_a)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="yellow")
        B = bldramme.create_text(190, 70, text=str(
            f_b)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="yellow")
        C = bldramme.create_text(300, 180, text=str(
            f_c)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="white")
        D = bldramme.create_text(420, 180, text=str(
            f_d)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="red")
        E = bldramme.create_text(470, 70, text=str(
            f_e)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="red")
        F = bldramme.create_text(760, 70, text=str(
            f_f)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="red")
        G = bldramme.create_text(760, 400, text=str(
            f_g)[0:5]+" W/m\u00b2", font=("Tacoma", 14), fill="red")
        flag = 1
    else:
        # Har der været indskrevet tekst i figuren, rettes den til nye værdier her.
        bldramme.itemconfigure(A, text=str(
            f_a)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
        bldramme.itemconfigure(B, text=str(
            f_b)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
        bldramme.itemconfigure(C, text=str(
            f_c)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
        bldramme.itemconfigure(D, text=str(
            f_d)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
        bldramme.itemconfigure(E, text=str(
            f_e)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
        bldramme.itemconfigure(F, text=str(
            f_f)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
        bldramme.itemconfigure(G, text=str(
            f_g)[0:5]+" W/m\u00b2", font=("Tacoma", 14))
    # Resultater skrives ud.
    # Først laves labes med tekstindholdet.
    løsning_øvre = tk.Label(løsningsramme, text="\nØvre atmosfæres temperatur: " +
                            str(t_øvre)[0:5]+" K ="+str(t_øvre-273.15)[0:5]+" \u00b0C.", font=("Tacoma", 14))
    løsning_nedre = tk.Label(løsningsramme, text="Nedre atmosfæres temperatur: "+str(
        t_nedre)[0:5]+" K ="+str(t_nedre-273.15)[0:4]+" \u00b0C.", font=("Tacoma", 14))
    løsning_Jorden = tk.Label(løsningsramme, text="Jordoverfladens temperatur: "+str(
        t_overflade)[0:5]+" K ="+str(t_overflade-273.15)[0:4]+" \u00b0C.\n", font=("Tacoma", 14))

    # Dernæst skrives de ud i løsningsrammen.
    løsning_øvre.grid(row=0, column=0, sticky="w")
    løsning_nedre.grid(row=1, column=0, sticky="w")
    løsning_Jorden.grid(row=2, column=0, sticky="w")

# Hvis brugeren trykker på Afslut-knappen, lukkes vinduet vha. nedenstående funktion.


def slut(event):
    vindue.destroy()
    Billedevindue.destroy()


flag = 0

# Et billedvindue konstrueres.
Billedevindue = tk.Tk()
Billedevindue.geometry("820x550+500+1")
Billedevindue.title("Efter Kiehl & Trenberth, 1997.")
bldramme = tk.Canvas(Billedevindue, width=820, height=550)
bldramme.grid()
bldfil = ImageTk.PhotoImage(Image.open("Atmosphere.jpg"))
bldramme.create_image(410, 275, image=bldfil)

# Et vindue til input og output konstrueres.
vindue = tk.Tk()
vindue.geometry("450x550+50+1")
vindue.title("Simpel klimamodel ver. 4.3 af Michael A. D. Møller")

# Standardskrifttypen defineres og justeres.
standard_skrifttype = tkFont.nametofont("TkDefaultFont")
standard_skrifttype.configure(family="Tacoma", size=14)

# Der laves en vejledningsramme samt rammer til input og fremvisning af resultater.
# Der laves også en knap-ramme, hvor knapper skrives.
vejledningsramme = tk.Frame(
    vindue, highlightthickness=1, highlightbackground="black")
inputramme = tk.Frame(vindue)
løsningsramme = tk.Frame(vindue)
knapramme = tk.Frame(vindue)

# Rammerne tændes.
vejledningsramme.pack()
inputramme.pack()
løsningsramme.pack()
knapramme.pack()

# En vejledningstekst skrives, og den laves om til en label, der kan sættes ind i rammen.
tekst_vejledning = "Indtast de ønskede parametre. Behold evt. start-\nværdierne.\n\nI højre kolonne står startværdierne anført."
vejledning = tk.Label(
    vejledningsramme, text=tekst_vejledning, font=("Tacoma", 14), justify=tk.LEFT)
vejledning.grid(column=0, row=0, sticky="ew")

# Inputteksten sættes op.
albedo_tekst = tk.Label(inputramme, text="A: ", font=(
    "Tacoma", 14, "italic")).grid(row=0, column=0)
albedo_enhed_tekst = tk.Label(inputramme, text="(0,313)", font=(
    "Tacoma", 14)).grid(row=0, column=5)

alfa_tekst = tk.Label(inputramme, text="\u03b1 : ", font=(
    "Tacoma", 14, "italic")).grid(row=1, column=0)
alfa_enhed_tekst = tk.Label(inputramme, text="(0,715)", font=(
    "Tacoma", 14)).grid(row=1, column=5)

beta_tekst = tk.Label(inputramme, text="\u03b2 : ", font=(
    "Tacoma", 14, "italic")).grid(row=2, column=0)
beta_enhed_tekst = tk.Label(inputramme, text="(0,103)", font=(
    "Tacoma", 14)).grid(row=2, column=5)

gamma_tekst = tk.Label(inputramme, text="\u03b3 : ", font=(
    "Tacoma", 14, "italic")).grid(row=3, column=0)
gamma_enhed_tekst = tk.Label(inputramme, text="(0,625)", font=(
    "Tacoma", 14)).grid(row=3, column=5)

delta_tekst = tk.Label(inputramme, text="\u03b4 : ", font=(
    "Tacoma", 14, "italic")).grid(row=4, column=0)
delta_enhed_tekst = tk.Label(inputramme, text="(0,207)", font=(
    "Tacoma", 14)).grid(row=4, column=5)


co2_tekst = tk.Label(inputramme, text="[CO\u2082]: ", font=(
    "Tacoma", 14, "italic")).grid(row=5, column=0)
co2_enhed_tekst = tk.Label(inputramme, text=" ppm", font=(
    "Tacoma", 14)).grid(row=5, column=4)
co2_standardtal_tekst = tk.Label(
    inputramme, text="(414,7 ppm)", font=("Tacoma", 14)).grid(row=5, column=5)

lum_tekst = tk.Label(inputramme, text="L: ", font=(
    "Tacoma", 14, "italic")).grid(row=6, column=0)
lum_enhed_tekst = tk.Label(inputramme, text=" W", font=(
    "Tacoma", 14)).grid(row=6, column=4)
lum_standardtal_tekst = tk.Label(
    inputramme, text="(3,846E26 W)", font=("Tacoma", 14)).grid(row=6, column=5)

afstand_tekst = tk.Label(inputramme, text="d: ", font=(
    "Tacoma", 14, "italic")).grid(row=7, column=0)
afstand_enhed_tekst = tk.Label(inputramme, text=" m", font=(
    "Tacoma", 14)).grid(row=7, column=4)
afstand_enhed_tekst = tk.Label(inputramme, text="(1,496E11 m)", font=(
    "Tacoma", 14)).grid(row=7, column=5)

# Inputfelter sættes op.
input_albedo = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_alfa = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_beta = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_gamma = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_delta = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_co2 = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_lum = tk.Entry(inputramme, width=8, font=("Tacoma,14"))
input_afstand = tk.Entry(inputramme, width=8, font=("Tacoma,14"))

# Default-værdier sættes på.
input_albedo.insert(0, '0.313')
input_alfa.insert(0, '0.715')
input_beta.insert(0, '0.103')
input_gamma.insert(0, '0.625')
input_delta.insert(0, '0.207')
input_co2.insert(0, '414.7')
input_lum.insert(0, '3.846E26')
input_afstand.insert(0, '1.496E11')

# Inputfelter og standardtal skrives op.
input_albedo.grid(row=0, column=3)
input_alfa.grid(row=1, column=3)
input_beta.grid(row=2, column=3)
input_gamma.grid(row=3, column=3)
input_delta.grid(row=4, column=3)
input_co2.grid(row=5, column=3)
input_lum.grid(row=6, column=3)
input_afstand.grid(row=7, column=3)

# Beregn- og afslut-knapper laves.
udregn_knap = tk.Button(knapramme, text="Beregn", font=("Tacoma", 14))
afslut_knap = tk.Button(knapramme, text="Afslut", font=("Tacoma", 14))

# Knapperne sættes ind i knaprammen.
udregn_knap.pack()
afslut_knap.pack()

# Der tjekkes hvilken knap, brugeren trykker på, og handling foretages.
udregn_knap.bind("<Button-1>", beregn)
afslut_knap.bind("<Button-1>", slut)

# Programmet kører i evig løkke.
vindue.mainloop()
