[問題] tkinter的Button無法帶入函數的參數?

看板Python作者 (leon)時間8年前 (2016/03/30 00:10), 8年前編輯推噓4(4010)
留言14則, 5人參與, 最新討論串1/1
我是新手幾乎沒啥基礎(其實大約十年前高中有學過一點C但忘光了), 最近誤入賊船買了深入淺出程式設計這本書 現在看到了第八章。教到了使用tkinter: from tkinter import* def save_data(x, y, z): file = open("data.txt","a") file.write("Deport:%s\nDescription:%s\nAddress:%s\n" %(x,y,z)) app = Tk() app.title("test") app.geometry('500x500+200+100') Label(app,text ='Deport:',height=3).pack() t1 = Entry(app) t1.pack() Label(app,text ='Description:',height=3).pack() t2 = Entry(app) t2.pack() Label(app,text ='Address:',height=3).pack() t3 = Entry(app) t3.pack() Button(app,text='save',width=10, command=save_data(t1.get(),t2.get(),t3.get())) .pack() app.mainloop() 這串主要是希望建立三個文字框,然後按下Button,可以自動儲存文字框內的資料。 書上的寫法是按下button後,直接執行函式,在函式中帶入文字框的值然後印出。 (就是直接再file.write()那串當中直接用get()獲得數值) 但我的寫法是希望按下button後,可以帶入文字框的值進入函式中,再印出。 但不知道為什麼我的方法總是失敗,一直無法順利得到想要的值。想了很久還是想不透 有稍微爬了一下文之後把command=save_data(t1.get(),t2.get(),t3.get())改成: command=lambda:save_data(t1.get(),t2.get(),t3.get()) 居然就可以成功了??!但我到現在還是不清楚原因。 是Button無法直接帶入有參數的函式嗎? 那加上"lambda:"這指令又是什麼意思? 抱歉問題有點長。希望有人可以幫助我一下...自己一個人學程式語言真的是很難阿!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.46.136.82 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1459267830.A.6B2.html ※ 編輯: leon80148 (114.46.136.82), 03/30/2016 00:10:52

03/30 01:45, , 1F
command=save_data(t1.get(),t2.get(),t3.get()) 等同
03/30 01:45, 1F

03/30 01:45, , 2F
save_data(t1.get(),t2.get(),t3.get())
03/30 01:45, 2F

03/30 01:45, , 3F
command=None
03/30 01:45, 3F

03/30 01:47, , 4F
一開始就已經執行完了,跟你按不按按鈕沒有任何關係
03/30 01:47, 4F

03/30 01:51, , 5F
lambda 則會產生一個小函式供你後面呼叫,按鈕有效
03/30 01:51, 5F

03/30 01:53, , 6F
拿C++比喻,前面command獲得的是第一次執行函數的回傳值
03/30 01:53, 6F

03/30 01:54, , 7F
lambda那個command獲得的是一個function pointer
03/30 01:54, 7F

03/30 17:19, , 8F
是 lambda似乎是 多參數button command 的唯一解
03/30 17:19, 8F

03/30 21:00, , 9F
Lambda 只是 closure 的特化, 怎麼可能會是唯一解...
03/30 21:00, 9F

03/31 00:03, , 10F
記得檔案開了要關...不然就用with
03/31 00:03, 10F

03/31 12:04, , 11F
就是要一個callable給他 memeber要有access參數的方法
03/31 12:04, 11F

03/31 12:05, , 12F
而最簡單的方法就是lambda這樣包.
03/31 12:05, 12F

04/01 10:43, , 13F
抱歉誤導了 意思是說要寫成單行的話
04/01 10:43, 13F

04/01 10:43, , 14F
不然就要多包一層
04/01 10:43, 14F
文章代碼(AID): #1M-gZsQo (Python)