作者leon80148 (leon)
看板Python
标题[问题] tkinter的Button无法带入函数的参数?
时间Wed Mar 30 00:10:28 2016
我是新手几乎没啥基础(其实大约十年前高中有学过一点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://webptt.com/cn.aspx?n=bbs/Python/M.1459267830.A.6B2.html
※ 编辑: leon80148 (114.46.136.82), 03/30/2016 00:10:52
1F:推 ResolaQQ: command=save_data(t1.get(),t2.get(),t3.get()) 等同 03/30 01:45
2F:→ ResolaQQ: save_data(t1.get(),t2.get(),t3.get()) 03/30 01:45
3F:→ ResolaQQ: command=None 03/30 01:45
4F:→ ResolaQQ: 一开始就已经执行完了,跟你按不按按钮没有任何关系 03/30 01:47
5F:→ ResolaQQ: lambda 则会产生一个小函式供你後面呼叫,按钮有效 03/30 01:51
6F:→ ResolaQQ: 拿C++比喻,前面command获得的是第一次执行函数的回传值 03/30 01:53
7F:→ ResolaQQ: lambda那个command获得的是一个function pointer 03/30 01:54
8F:推 ENEP: 是 lambda似乎是 多参数button command 的唯一解 03/30 17:19
9F:→ uranusjr: Lambda 只是 closure 的特化, 怎麽可能会是唯一解... 03/30 21:00
10F:推 Sunal: 记得档案开了要关...不然就用with 03/31 00:03
11F:推 Yshuan: 就是要一个callable给他 memeber要有access参数的方法 03/31 12:04
12F:→ Yshuan: 而最简单的方法就是lambda这样包. 03/31 12:05
13F:→ ENEP: 抱歉误导了 意思是说要写成单行的话 04/01 10:43
14F:→ ENEP: 不然就要多包一层 04/01 10:43