2016-12-15 34 views
1

我不知道該怎樣解決我的問題,我有一個看起來像這樣的代碼的想法返回值:Tkinter的:試圖從一個按鈕

def f(x): 
    x=x.get() 
    y=x**2 
    z=x-1 

Mylist=[] 
x=Entry(master) 
cmd=lambda x=x : f(x) 
Button(master, text="Ok", command=cmd).pack() 

什麼我想要做的是一樣的東西

Mylist.append([y,z]) 

爲了在我的程序中使用我的結果在其他地方

而且我知道,我可以用一個類,但老師不希望我們使用類爲該項目...

你有什麼想法嗎?

回答

1

使用append(f(x))lambdareturn [y,z]f(x)。你必須將字符串從Entry轉換成intfloat

import tkinter as tk 

# --- functions --- 

def f(x): 
    x = int(x.get()) # convert string to int (or float) 
    y = x**2 
    z = x-1 
    return [y, z] 

# --- main --- 

my_list = [] 

master = tk.Tk() 

e = tk.Entry(master) 
e.pack() 

cmd = lambda x=e:my_list.append(f(x)) 

tk.Button(master, text="Ok", command=cmd).pack() 

master.mainloop() 

print(my_list) 

你可以在lambda轉換x然後f(x)只能做數學計算

編輯:修正版本@ TadhgMcDonald - 詹森在註釋中提到。

def f(x): 
    return [x**2, x-1] 

#cmd = lambda x=int(e.get()):my_list.append(f(x)) # wrong version 
cmd = lambda:my_list.append(f(int(e.get()))) # correect version 
+0

沒有你不能真正做到'拉姆達X = INT(e.get())'因爲它是在定義時執行了'x'的默認值,你會需要做'lambda x = e:my_list.append(f(int(e.get())))'但我不確定lambda在這一點上是否有用,我只是把它放在一個二線功能。 –

+0

@ TadhgMcDonald-Jensen你是對的,我忘了這一點,我沒有檢查這個代碼。 – furas

0

你知道單擊該按鈕將執行cmd,所以把你想做的任何事情(包括追加到列表)在那裏。請注意,這意味着要麼將cmd更改爲lambda,要麼將此功能添加到f(或者更深奧的東西)。

2

附加命令按鈕的整點是落實問題的答案「我想要什麼,當我點擊按鈕,會發生什麼?」。在你的情況下,答案是「我希望它)從一個入口小部件獲取值,b)計算一個新值,並c)將它追加到列表中」。

因此,寫一個函數來做到這一點,然後從你的按鈕調用該函數。在這種情況下,由於按鈕和條目窗口小部件之間的關係爲1:1,因此不需要使用lambda表達式。 lambda本身沒有任何問題,但是在這種情況下它增加了複雜性而沒有提供任何值,所以我建議不要使用它。通過而不是使用lambda,由於很難在lambda中設置斷點或添加其他功能,因此隨着時間的推移代碼將更容易調試和維護。

例如:

def f(x): 
    y=x**2 
    z=x-1 

def do_calculation(): 
    x_value = float(x.get()) 
    result = f(x_value) 
    my_list.append(result) 

... 
tk.Button(..., command=do_calculation) 
+2

''global''關鍵字只有在重新分配一個變量(帶有'=')時纔是必要的,所以當它明確告訴讀者'my_list'指的是一個全局變量時,它不是必須附加到它:) –

+0

@ TadhgMcDonald-Jensen:是的,我對使用'global'有點sl sl。我會解決它。我認爲將其標記爲全局以便代碼更加明顯,儘管'global'不是絕對必要的。但是,如果我使用它,我也應該使用它'x'。 –