Python 3.x Tkinter:尝试从按钮返回值
我不知道如何解决我的问题我有一个代码如下:Python 3.x Tkinter:尝试从按钮返回值,python-3.x,tkinter,Python 3.x,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]) 为了在我的程序中的其他地方使用我的结果 我也知道我可以用课堂,但老师不希望我们用课堂来做那个项目 你有什么想法吗?你知
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])
为了在我的程序中的其他地方使用我的结果
我也知道我可以用课堂,但老师不希望我们用课堂来做那个项目
你有什么想法吗?你知道点击按钮会执行
cmd
,所以把你想做的事情(包括添加到列表中)放在那里。请注意,这意味着要么将cmd
更改为非lambda
,要么将此功能添加到f
(或更为深奥的内容)。在lambda
中使用append(f(x))
并在f(x)
中返回[y,z]。您必须将字符串从Entry
转换为int
或float
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 Jensen版本
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
将命令附加到按钮的全部目的是实现对以下问题的答案:“当我单击按钮时,我希望发生什么?”。在您的例子中,答案是“我希望它a)从条目小部件获取值,b)计算新值,c)将其附加到列表” 因此,编写一个函数来实现这一点,然后从按钮调用该函数。在这种情况下,您不需要lambda,因为按钮和条目小部件之间有1:1的关系。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)
不,您实际上不能执行
lambda x=int(e.get())
,因为它在定义时正在执行x
的默认值,您需要执行lambda x=e:my_list.append(f(int(e.get()))
,但我不确定lambda在这一点上是否有用,我只是将它放在一个一行两行的函数中。@Tadhgmandon Jensen您是对的,我忘记了这一点,也没有检查这段代码。global
关键字只有在重新分配变量(使用=
)时才是必需的,因此,在将它放在那里的同时,向读者清楚地表明,我的列表
是指一个全局变量,严格来说,不需要附加到它上面:)@Tadhgmandon Jensen:是的,我在使用global
时有点草率。我会修好的。我认为最好将其标记为全局,这样代码就更明显了,尽管global
不是严格必需的。不过,如果我使用它,我也应该在x
中使用它。