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
中使用它。