2014-05-02 44 views
-1

入口存儲輸入我試圖搜索如何從使用TK的輸入保存變量,但我找不到任何方式來做到這一點。tk:從變量

這是我使用的代碼更清潔的版本:

from tkinter import * 
from tkinter import ttk 

main=Tk() 
main.title("Test") 
book = [] 

class test1: 
     def __init__(self): 
       self.name = "" 
       self.tel = "" 

new1 = test1() 

def salva(argm): 
     argm.name = str(nome.get()) 
     argm.tel = str(telefono.get()) 

def nuovo_ordine(): 
     tutto = Toplevel() 
     scheda = ttk.Frame(tutto,padding="10 10 10 10") 
     scheda.rowconfigure(0, weight=1) 
     scheda.columnconfigure(0, weight=1) 
     scheda.grid(column=0,row=0,sticky=(N,W,E,S)) 
     global nome 
     global telefono 
     global new1 
     nome = StringVar() 
     telefono = StringVar() 
     ttk.Label(scheda,text="Telefono").grid(column=1,row=2) 
     ttk.Label(scheda,text="Nome").grid(column=1,row=1) 
     tel1 = ttk.Entry(scheda,textvariable=telefono).grid(column=2,row=2) 
     nome1 = ttk.Entry(scheda,textvariable=nome).grid(column=2,row=1) 
     salva_tasto=Button(scheda,text="Salva",command=salva(new1)).grid(column=1,row=4) 
     fine_tasto=Button(scheda,text="Fine",command=tutto.destroy).grid(column=3,row=4) 

def stampa(argm2): 
     print (argm2.name) 
     print (argm2.tel) 

dentro = ttk.Frame(main,padding="10 10 10 10") 
dentro.rowconfigure(0, weight=1) 
dentro.columnconfigure(0, weight=1) 
dentro.grid(column=0,row=0,sticky=(N,W,E,S)) 
nuovo=Button(dentro,text="Aggiungi Ordine", command=nuovo_ordine,  width=16).grid(column=1,row=2) 
stampa=Button(dentro,text="Stampa Ordini",command=stampa(new1), width=16).grid(column=2,row=3) 
chiudi=Button(dentro,text="Chiudi",command=main.destroy, width=16).grid(column=3,row=4) 
main.mainloop() 

問題是,它似乎像它無法在變量存儲輸入,而如果我嘗試: 打印(telefono.get ()) 我得到正確的值...

在此先感謝!

回答

3
salva_tasto=Button(scheda,text="Salva",command=salva(new1)).grid(column=1,row=4) 

如果在command指定函數的參數,你必須將它包裝在一個lambda所以它不是立即調用。

salva_tasto=Button(scheda,text="Salva",command= lambda *args: salva(new1)).grid(column=1,row=4) 

順便說一句,這是一個常見的錯誤是試圖將一個小部件分配給一個變量,並gridpack它在同一行。如果你想salva_tasto是一個按鈕,而不是無論是通過grid返回,你應該做的

salva_tasto=Button(scheda,text="Salva",command= lambda *args: salva(new1)) 
salva_tasto.grid(column=1,row=4) 

編輯:你也有一個命名問題。你有一個功能stampa,但你用stampa=Button(...覆蓋該名稱。您應該將其中一個變量的名稱更改爲其他名稱。

+0

第一:謝謝你的回答!但是使用lambda沒有幫助,我仍然因打印而變得空白。此外,* args代表什麼? – tanke88

+0

你是否還在'lambda中包裝'command = stampa(new1)'?每個使用圓括號的命令都需要一個lambda。 '* args'是一個[任意參數列表](https://docs.python.org/2/tutorial/controlflow.html#arbitrary-argument-lists)。我把它放進去是因爲我記不清有多少參數在被調用時會傳遞給一個命令,'args'會防止任何「太多參數」錯誤。嘗試一下,你可以簡單地使用'lambda:'而不用'* args'。 – Kevin

+0

是的我嘗試過,我現在得到的是: TypeError:'NoneType'對象不可調用 與stampa(new1)命令相關 與此同時,我注意到沒有lambda,如果我定義self.tel =「aaa」,只要我啓動程序就會打印出來。 – tanke88