2016-05-16 96 views
2

我是一名電氣工程師,我是Python編程新手。Tkinter錯誤類型變量

我想寫一個三相變壓器計算器的Python程序。該程序非常簡單,只需要幾個代數運算;我寫了沒有GUI的簡單的Python代碼,它工作得很好。所以我決定使用Tkinter模塊製作相同的程序,爲我的應用程序提供GUI。我有一些錯誤,我讀了很多問題,並問了很多關於這個社區的問題,但我無法解決它。我無法追查錯誤的原因。代碼是:

from tkinter import * 
from math import * 


finestra=Tk() 
finestra.geometry('800x800+300+300') 
finestra.title('Dimensionamento Trasformatore') 


def calcola(Vn,Vn2,Sn,Vcc,V_spira,f,Bmax,mu,J,w,Snf,N1,N2,If1,If2,kv,ki,fi,fi_c,S_colonna,S_conduttore1,S_conduttore2,Sezione_netta_cu1,Sezione_netta_cu2,Vf1,Vf2): 

    try: 


     #lettura caselle di testo/ read entry 
       Vn=float(Vn_s.get()) 
       Vn2=float(Vn2_s.get()) 
       Vcc=float(Vcc_s.get()) 
       V_spira=float(Vspira_s.get()) 
       Sn=float(Sn_s.get()) 
       J=float(J_s.get()) 
       mu=float(mu_s.get()) 
       Bmax=float(Bmax_s.get()) 
       f=float(f_s.get()) 

    except ValueError: 
       print('inserito valore sbagliato') 
    else: 



     #calcoli/calculate 
       if (var_1.get()==1): 
         collegamento1='triangolo' 
       else: 
         collegamento1='stella' 
       if (var_2.get()==1): 
         collegamento2='triangolo' 
       else: 
         collegamento2='stella' 


       Snf=(Sn/3.0) 
       w=(2*pi*f) 
       if (collegamento1=='triangolo'): 
          Vf1=Vn 
       else: 
          Vf1=(Vn/sqrt(3)) 
       if (collegamento2=='triangolo'): 
          Vf2=(Vn2) 
       else: 
          Vf2=(Vn2/sqrt(3)) 
       N1=Vf1/V_spira 
       N2=Vf2/V_spira 
       If1=Snf/Vf1 
       If2=(Snf/Vf2) 
       kv=Vf1/Vf2 
       ki=If2/If1 
       fi=Vf1/(w*N1) 
       fi_c=(N1*fi) 
       S_colonna=(fi_c/(Bmax*sqrt(2))) 
       S_conduttore1=(If1/J) 
       S_conduttore2=(If2/J) 
     #  Sezione_netta_cu1.set(S_conduttore1*N1/k_stip_cu) 
     #  Sezione_netta_cu2.set(S_conduttore2*N2/k_stip_cu) 

       testo_23=Label(finestra,text=str(N1)).grid(sticky=W,row=4,column=5) 
       testo_24=Label(finestra,text=str(N2)).grid(sticky=W,row=6,column=5) 
       testo_25=Label(finestra,text=str(kv)).grid(sticky=W,row=11,column=5) 
       testo_26=Label(finestra,text=str(ki)).grid(sticky=W,row=13,column=5) 
       testo_27=Label(finestra,text=str(fi_c)).grid(sticky=W,row=21,column=5) 
       testo_28=Label(finestra,text=str(S_colonna)).grid(sticky=W,row=25,column=5) 
       testo_29=Label(finestra,text=str(S_conduttore1)).grid(sticky=W,row=19,column=5) 
       testo_30=Label(finestra,text=str(S_conduttore2)).grid(sticky=W,row=17,column=5) 
##    testo_31=Label(finestra,text=str(Sezione_netta_cu1)).grid(sticky=W,row=16,column=5) 
##    testo_32=Label(finestra,text=str(Sezione_netta_cu2)).grid(sticky=W,row=8,column=5) 
##    testo_33=Label(finestra,text=str(N1)).grid(sticky=W,row=14,column=5) 
##    testo_34=Label(finestra,text=str(N1)).grid(sticky=W,row=22,column=5) 





       return; 







#Testi/label 
testo_0=Label(finestra,text="Parametri di ingresso:").grid(sticky=W,row=0,column=0) 
testo_1=Label(finestra,text="Collegamento primario:").grid(sticky=W,row=3,column=0) 
testo_2=Label(finestra,text="Collegamento secondario:").grid(sticky=W,row=5,column=0) 
testo_3=Label(finestra,text="Tensione nominale concatenata primaria:").grid(sticky=W,row=10,column=0) 
testo_4=Label(finestra,text="Tensione nominale concatenata secondaria:").grid(sticky=W,row=12,column=0) 
testo_5=Label(finestra,text="Induzione massima:").grid(sticky=W,row=20,column=0) 
testo_6=Label(finestra,text="Densita di corrente:").grid(sticky=W,row=24,column=0) 
testo_7=Label(finestra,text="Frequenza:").grid(sticky=W,row=18,column=0) 
testo_8=Label(finestra,text="Tensione di corto circuito:").grid(sticky=W,row=16,column=0) 
testo_9=Label(finestra,text="Potenza apparente nominale:").grid(sticky=W,row=8,column=0) 
testo_10=Label(finestra,text="Volt-spira:").grid(sticky=W,row=14,column=0) 
testo_11=Label(finestra,text="Permeabilita del ferro:").grid(sticky=W,row=22,column=0) 
testo_12=Label(finestra,text="Valori calcolati:").grid(sticky=W,row=0,column=5) 
testo_13=Label(finestra,text="Numero spire primario:").grid(sticky=W,row=3,column=5) 
testo_14=Label(finestra,text="Numero spire secondario:").grid(sticky=W,row=5,column=5) 
testo_15=Label(finestra,text="Rapporto trasformazione tensione:").grid(sticky=W,row=10,column=5) 
testo_16=Label(finestra,text="Rapporto trasformazione corrente:").grid(sticky=W,row=12,column=5) 
testo_17=Label(finestra,text="Flusso concatenato efficace:").grid(sticky=W,row=20,column=5) 
testo_18=Label(finestra,text="Sezione colonna:").grid(sticky=W,row=24,column=5) 
testo_19=Label(finestra,text="Sezione conduttore primario:").grid(sticky=W,row=18,column=5) 
testo_20=Label(finestra,text="Sezione conduttore secondario:").grid(sticky=W,row=16,column=5) 
testo_21=Label(finestra,text="Sezione avvolgimento primario netta:").grid(sticky=W,row=8,column=5) 
testo_22=Label(finestra,text="Sezione avvolgimento secondario netta:").grid(sticky=W,row=14,column=5) 





#variabili 
If1=DoubleVar() 
If2=DoubleVar() 
N1=DoubleVar() 
N2=DoubleVar() 
var_1=IntVar() 
var_2=IntVar() 
Vn=DoubleVar() 
Vf1=DoubleVar() 
Vf2=DoubleVar() 
Vn2=DoubleVar() 
Vcc=DoubleVar() 
V_spira=DoubleVar() 
Sn=DoubleVar() 
Snf=DoubleVar() 
J=DoubleVar() 
mu=DoubleVar() 
Bmax=DoubleVar() 
f=DoubleVar() 
Vn_s=StringVar() 
Vn2_s=StringVar() 
Vcc_s=StringVar() 
Vspira_s=StringVar() 
Sn_s=StringVar() 
J_s=StringVar() 
mu_s=StringVar() 
Bmax_s=StringVar() 
f_s=StringVar() 
collegamento1=StringVar() 
collegamento2=StringVar() 
w=DoubleVar() 
kv=DoubleVar() 
ki=DoubleVar() 
fi=DoubleVar() 
fi_c=DoubleVar() 
S_colonna=DoubleVar() 
S_conduttore1=DoubleVar() 
S_conduttore2=DoubleVar() 
Sezione_netta_cu1=DoubleVar() 
Sezione_netta_cu2=DoubleVar() 




#Radiobutton 
#collegamento primario/ first winding 
collegamentoI_1=Radiobutton(finestra,text='triangolo',value=1,variable=var_1) 
collegamentoI_1.grid(row=4,column=0) 
collegamentoI_2=Radiobutton(finestra,text='stella',value=2,variable=var_1) 
collegamentoI_2.grid(row=4,column=1) 
#collegamento secondario/ second winding 
collegamentoII_1=Radiobutton(finestra,text='triangolo',value=1,variable=var_2) 
collegamentoII_1.grid(row=6,column=0) 
collegamentoII_2=Radiobutton(finestra,text='stella',value=2,variable=var_2) 
collegamentoII_2.grid(row=6,column=1) 





#caselle di testo/entry 
Vn_=Entry(finestra,textvariable=Vn_s) 
Vn_.grid(row=11,column=0) 
Vspira_=Entry(finestra,textvariable=Vspira_s) 
Vspira_.grid(row=15,column=0) 
Vn2_=Entry(finestra,textvariable=Vn2_s) 
Vn2_.grid(row=13,column=0) 
Sn_=Entry(finestra,textvariable=Sn_s) 
Sn_.grid(row=9,column=0) 
Bmax_=Entry(finestra,textvariable=Bmax_s) 
Bmax_.grid(row=21,column=0) 
mu_=Entry(finestra,textvariable=mu_s) 
mu_.grid(row=23,column=0) 
Vcc_=Entry(finestra,textvariable=Vcc_s) 
Vcc_.grid(row=17,column=0) 
f_=Entry(finestra,textvariable=f_s) 
f_.grid(row=19,column=0) 
J_=Entry(finestra,textvariable=J_s) 
J_.grid(row=25,column=0) 


#Calculatebutton 
gobutton=Button(finestra,text='Calcola',command=calcola(Vn,Vn2,Sn,Vcc,V_spira,f,Bmax,mu,J,w,Snf,N1,N2,If1,If2,kv,ki,fi,fi_c,S_colonna,S_conduttore1,S_conduttore2,Sezione_netta_cu1,Sezione_netta_cu2,Vf1,Vf2)) 
gobutton.grid(row=28, column=3) 




finestra.mainloop() 

我遇到的第一種錯誤是ValueError: could not convert string to float。我讀這可能會發生,因爲在開始時,入口小部件是空的,所以Python可以將其轉換爲浮動。所以我加了try/except塊。現在,當我啓動程序時,它會在除了block外打印一條錯誤消息(我無法理解這一點:calcola函數與計算按鈕相關聯,但似乎在開始時無按鈕運行該功能)不會發生其他事情,儘管在輸入框中輸入數字並按下計算按鈕。我懷疑的是,我使用函數的方式是錯誤的(語法或其他)。如果有人能幫助我,我會很感激。

對不起,對英文不好。非常感謝你。 尼古拉

+0

本身非capisci好處LA MIA risposta scrivi魁嘀咕於Italiano。 – Veltro

+0

Ciao Liam,ti ringrazio infinitamente per la tua risposta。 Se posso approfittare della tua gentilezza ti vorrei chiedere delle spiegazioni。 Dunque prima di tutto ho corretto il codice e funziona perfettamente,perònon capisco lamba esattamente a cosa serva。如果你沒有意識到你的錯誤,那麼你可以在這裏找到你想要的東西。 L'errore era solo quello? Grazie ancora stavo impazzendo。 –

+0

Mi spiego meglio :(premettendo che so programmare,ma non a livello pro,in C e matlab e pochissimo fortran)dalla mia esperienza una function non dovrebbe essere eseguita ad inizio codice。 Sto cercando in rete delle spiegazioni ma francamente non mièmolto chiaro il funzionamento。 –

回答

0

通過你的函數傳遞參數時,如果它是由Tkinter的按鈕叫你應該總是使用lambda聲明是這樣的:Button(finestra,text='Calcola',command=lambda: calcola(paramaters..)或程序啓動時的功能只會被調用一次。

代碼:

from tkinter import * 
from math import * 


finestra=Tk() 
finestra.geometry('800x800+300+300') 
finestra.title('Dimensionamento Trasformatore') 


def calcola(Vn,Vn2,Sn,Vcc,V_spira,f,Bmax,mu,J,w,Snf,N1,N2,If1,If2,kv,ki,fi,fi_c,S_colonna,S_conduttore1,S_conduttore2,Sezione_netta_cu1,Sezione_netta_cu2,Vf1,Vf2): 

    try: 


     #lettura caselle di testo/ read entry 
       Vn=float(Vn_s.get()) 
       Vn2=float(Vn2_s.get()) 
       Vcc=float(Vcc_s.get()) 
       V_spira=float(Vspira_s.get()) 
       Sn=float(Sn_s.get()) 
       J=float(J_s.get()) 
       mu=float(mu_s.get()) 
       Bmax=float(Bmax_s.get()) 
       f=float(f_s.get()) 

    except ValueError: 
       print('inserito valore sbagliato') 
    else: 



     #calcoli/calculate 
       if (var_1.get()==1): 
         collegamento1='triangolo' 
       else: 
         collegamento1='stella' 
       if (var_2.get()==1): 
         collegamento2='triangolo' 
       else: 
         collegamento2='stella' 


       Snf=(Sn/3.0) 
       w=(2*pi*f) 
       if (collegamento1=='triangolo'): 
          Vf1=Vn 
       else: 
          Vf1=(Vn/sqrt(3)) 
       if (collegamento2=='triangolo'): 
          Vf2=(Vn2) 
       else: 
          Vf2=(Vn2/sqrt(3)) 
       N1=Vf1/V_spira 
       N2=Vf2/V_spira 
       If1=Snf/Vf1 
       If2=(Snf/Vf2) 
       kv=Vf1/Vf2 
       ki=If2/If1 
       fi=Vf1/(w*N1) 
       fi_c=(N1*fi) 
       S_colonna=(fi_c/(Bmax*sqrt(2))) 
       S_conduttore1=(If1/J) 
       S_conduttore2=(If2/J) 
     #  Sezione_netta_cu1.set(S_conduttore1*N1/k_stip_cu) 
     #  Sezione_netta_cu2.set(S_conduttore2*N2/k_stip_cu) 

       testo_23=Label(finestra,text=str(N1)).grid(sticky=W,row=4,column=5) 
       testo_24=Label(finestra,text=str(N2)).grid(sticky=W,row=6,column=5) 
       testo_25=Label(finestra,text=str(kv)).grid(sticky=W,row=11,column=5) 
       testo_26=Label(finestra,text=str(ki)).grid(sticky=W,row=13,column=5) 
       testo_27=Label(finestra,text=str(fi_c)).grid(sticky=W,row=21,column=5) 
       testo_28=Label(finestra,text=str(S_colonna)).grid(sticky=W,row=25,column=5) 
       testo_29=Label(finestra,text=str(S_conduttore1)).grid(sticky=W,row=19,column=5) 
       testo_30=Label(finestra,text=str(S_conduttore2)).grid(sticky=W,row=17,column=5) 
##    testo_31=Label(finestra,text=str(Sezione_netta_cu1)).grid(sticky=W,row=16,column=5) 
##    testo_32=Label(finestra,text=str(Sezione_netta_cu2)).grid(sticky=W,row=8,column=5) 
##    testo_33=Label(finestra,text=str(N1)).grid(sticky=W,row=14,column=5) 
##    testo_34=Label(finestra,text=str(N1)).grid(sticky=W,row=22,column=5) 





       return; 







#Testi/label 
testo_0=Label(finestra,text="Parametri di ingresso:").grid(sticky=W,row=0,column=0) 
testo_1=Label(finestra,text="Collegamento primario:").grid(sticky=W,row=3,column=0) 
testo_2=Label(finestra,text="Collegamento secondario:").grid(sticky=W,row=5,column=0) 
testo_3=Label(finestra,text="Tensione nominale concatenata primaria:").grid(sticky=W,row=10,column=0) 
testo_4=Label(finestra,text="Tensione nominale concatenata secondaria:").grid(sticky=W,row=12,column=0) 
testo_5=Label(finestra,text="Induzione massima:").grid(sticky=W,row=20,column=0) 
testo_6=Label(finestra,text="Densita di corrente:").grid(sticky=W,row=24,column=0) 
testo_7=Label(finestra,text="Frequenza:").grid(sticky=W,row=18,column=0) 
testo_8=Label(finestra,text="Tensione di corto circuito:").grid(sticky=W,row=16,column=0) 
testo_9=Label(finestra,text="Potenza apparente nominale:").grid(sticky=W,row=8,column=0) 
testo_10=Label(finestra,text="Volt-spira:").grid(sticky=W,row=14,column=0) 
testo_11=Label(finestra,text="Permeabilita del ferro:").grid(sticky=W,row=22,column=0) 
testo_12=Label(finestra,text="Valori calcolati:").grid(sticky=W,row=0,column=5) 
testo_13=Label(finestra,text="Numero spire primario:").grid(sticky=W,row=3,column=5) 
testo_14=Label(finestra,text="Numero spire secondario:").grid(sticky=W,row=5,column=5) 
testo_15=Label(finestra,text="Rapporto trasformazione tensione:").grid(sticky=W,row=10,column=5) 
testo_16=Label(finestra,text="Rapporto trasformazione corrente:").grid(sticky=W,row=12,column=5) 
testo_17=Label(finestra,text="Flusso concatenato efficace:").grid(sticky=W,row=20,column=5) 
testo_18=Label(finestra,text="Sezione colonna:").grid(sticky=W,row=24,column=5) 
testo_19=Label(finestra,text="Sezione conduttore primario:").grid(sticky=W,row=18,column=5) 
testo_20=Label(finestra,text="Sezione conduttore secondario:").grid(sticky=W,row=16,column=5) 
testo_21=Label(finestra,text="Sezione avvolgimento primario netta:").grid(sticky=W,row=8,column=5) 
testo_22=Label(finestra,text="Sezione avvolgimento secondario netta:").grid(sticky=W,row=14,column=5) 





#variabili 
If1=DoubleVar() 
If2=DoubleVar() 
N1=DoubleVar() 
N2=DoubleVar() 
var_1=IntVar() 
var_2=IntVar() 
Vn=DoubleVar() 
Vf1=DoubleVar() 
Vf2=DoubleVar() 
Vn2=DoubleVar() 
Vcc=DoubleVar() 
V_spira=DoubleVar() 
Sn=DoubleVar() 
Snf=DoubleVar() 
J=DoubleVar() 
mu=DoubleVar() 
Bmax=DoubleVar() 
f=DoubleVar() 
Vn_s=StringVar() 
Vn2_s=StringVar() 
Vcc_s=StringVar() 
Vspira_s=StringVar() 
Sn_s=StringVar() 
J_s=StringVar() 
mu_s=StringVar() 
Bmax_s=StringVar() 
f_s=StringVar() 
collegamento1=StringVar() 
collegamento2=StringVar() 
w=DoubleVar() 
kv=DoubleVar() 
ki=DoubleVar() 
fi=DoubleVar() 
fi_c=DoubleVar() 
S_colonna=DoubleVar() 
S_conduttore1=DoubleVar() 
S_conduttore2=DoubleVar() 
Sezione_netta_cu1=DoubleVar() 
Sezione_netta_cu2=DoubleVar() 




#Radiobutton 
#collegamento primario/ first winding 
collegamentoI_1=Radiobutton(finestra,text='triangolo',value=1,variable=var_1) 
collegamentoI_1.grid(row=4,column=0) 
collegamentoI_2=Radiobutton(finestra,text='stella',value=2,variable=var_1) 
collegamentoI_2.grid(row=4,column=1) 
#collegamento secondario/ second winding 
collegamentoII_1=Radiobutton(finestra,text='triangolo',value=1,variable=var_2) 
collegamentoII_1.grid(row=6,column=0) 
collegamentoII_2=Radiobutton(finestra,text='stella',value=2,variable=var_2) 
collegamentoII_2.grid(row=6,column=1) 





#caselle di testo/entry 
Vn_=Entry(finestra,textvariable=Vn_s) 
Vn_.grid(row=11,column=0) 
Vspira_=Entry(finestra,textvariable=Vspira_s) 
Vspira_.grid(row=15,column=0) 
Vn2_=Entry(finestra,textvariable=Vn2_s) 
Vn2_.grid(row=13,column=0) 
Sn_=Entry(finestra,textvariable=Sn_s) 
Sn_.grid(row=9,column=0) 
Bmax_=Entry(finestra,textvariable=Bmax_s) 
Bmax_.grid(row=21,column=0) 
mu_=Entry(finestra,textvariable=mu_s) 
mu_.grid(row=23,column=0) 
Vcc_=Entry(finestra,textvariable=Vcc_s) 
Vcc_.grid(row=17,column=0) 
f_=Entry(finestra,textvariable=f_s) 
f_.grid(row=19,column=0) 
J_=Entry(finestra,textvariable=J_s) 
J_.grid(row=25,column=0) 


#Calculatebutton 
gobutton=Button(finestra,text='Calcola',command=lambda: calcola(Vn,Vn2,Sn,Vcc,V_spira,f,Bmax,mu,J,w,Snf,N1,N2,If1,If2,kv,ki,fi,fi_c,S_colonna,S_conduttore1,S_conduttore2,Sezione_netta_cu1,Sezione_netta_cu2,Vf1,Vf2)) 
gobutton.grid(row=28, column=3) 




finestra.mainloop()