import tkinter as tk
import random

def caclulate(N):
    """Πραγματοποίηση των υπολογισμών για δεδομένο N """    
    state=[]
    P=[]
    CP=[]
    H_p=[]
    for i in range(N):
        state.append(i)
        P.append(1./N)
        if i > 0 :
            CP.append(1./N+CP[i-1])
        else :
            CP.append(1./N)        
        H_p.append(0.)
    for ii in range(1000):
        r = random.random()
        for i in range(N):
            if r <  CP[i]:
                H_p[i]+=1
                break            
    l=[]
    for i in range(N):
        l.append(tk.Label(root, text = "P("+str(i)+") = "+ str(H_p[i])))
    return l   # επιστρέφει μία λίστα από αντ. τα οποια μπορούν να τοποθετιθούν σε επόμενη φάση.


def runonclik(root):
    ''' Ορισμός της συν. που εκτ. από το κουμπί  b1 '''
    N=int(entry.get())   # διάβασμα του text από το αντ. entry 
    l=caclulate(N)    # κάλεσμα της συν. που θα κάνει τους υπολογισμούς
    msg = tk.Message( root,text = "Το αποτέλεσμα είναι :")  
    msg.pack()        # ζωγρ. του msg sto root παράθιρο
    for i in range(len(l)):
        l[i].pack()   # ζωγρ. των l[..] που φτίχνοντέ στην συν. calculate,  και εμφανίζωντε στο root παράθιρο

root = tk.Tk()    # ορισμός του κεντρικού παραθίρου
root.geometry("700x250")  # ορισμός διαστάσεων του κεντρικού παραθίρου (προερετικός)
Tex=tk.Message(root,text="Αριθμός καταστάσεων")  # μήνημα για περιγραφή δεδωμέων
entry = tk.Entry(root)            # αντιήμενο entry για να ΄διαβάσουμε δεδομένα
entry.insert(tk.END,"2")          # αναγραφή αρχικής τιμής στο αντιήμενο entry 
Tex.pack()
entry.pack()


# κουμπί αντικήμενο που έχει events και εκτελέη κόδικά όταν πατιθεί : 
b1 = tk.Button(root, text = "Αποτέλεσμα",command = lambda  : runonclik(root) )
# τοποθέτηση κουμπιού
b1.pack()

# υποχρεοτικό κάνει loop πάνω στα παράθηρα και αναμένει αλιλεπίδραση από τον χρήστη ,mouse keyboard κλπ.
tk.mainloop()