Python/Tkinter-用于在多个参数不起作用的情况下运行函数的按钮

Python/Tkinter-用于在多个参数不起作用的情况下运行函数的按钮,python,button,lambda,tkinter,multiple-arguments,Python,Button,Lambda,Tkinter,Multiple Arguments,我正在尝试编写一个程序,该程序将显示4行2列,其中列0为标签,列1为条目。然后,当左键单击按钮时,将这4个整数项作为参数传递给函数。以下是我目前的代码: from tkinter import * root = Tk() class ClassName(): def __init__(self, master): self.run_button = Button(self.master, text="Button Text", bg="green", fg="b

我正在尝试编写一个程序,该程序将显示4行2列,其中列0为标签,列1为条目。然后,当左键单击按钮时,将这4个整数项作为参数传递给函数。以下是我目前的代码:

from tkinter import *

root = Tk()


class ClassName():

     def __init__(self, master):

       self.run_button = Button(self.master, text="Button Text", bg="green", fg="black", 
                               command="HERE IS WHERE I NEED HELP")
       self.run_button.grid(row=4, columnspan=2)

       self.label1 = Label(master, text="Entry 1").grid(row=0, sticky=E)
       self.label2 = Label(master, text="Entry 2").grid(row=1, sticky=E)
       self.label3 = Label(master, text="Entry 3").grid(row=2, sticky=E)
       self.label4 = Label(master, text="Entry 4").grid(row=3, sticky=E)

       self.entry1 = Entry(master).grid(row=0, column=1, sticky=W)
       self.entry2 = Entry(master).grid(row=1, column=1, sticky=W)
       self.entry3 = Entry(master).grid(row=2, column=1, sticky=W)
       self.entry4 = Entry(master).grid(row=3, column=1, sticky=W)
然后我想将这4个条目通过另一个名为
的函数传递给\u函数
。_函数所做的一切就是根据4个条目的值打印出一些内容。因此,我剩下的代码如下所示:

def the_function(self, a, b, c, d):
#    Ensure a, b, c, and d are integers, 
#    do some math on the numbers and print something out based on the
#    values of a, b, c and d.

irrelevant_variable = ClassName(root)
root.mainloop()
该函数在没有GUI的情况下可以正常工作,但我不知道如何创建一个按钮,该按钮接受
self.entry1
,并在
函数中作为
a
传递


其他帖子让我认为我应该使用
lambda
命令,但我不确定这在这个函数中是如何工作的。

你说得对-
lambda
允许你定义一个匿名的内嵌函数:

...command=lambda: the_function(entry1.get(), entry2.get(), entry3.get(), entry4.get())
它基本上起包装器的作用。您也可以这样做:

def mywrapper(self):
    the_function(entry1.get(), entry2.get(), entry3.get(), entry4.get())
然后将其绑定到按钮:

...command=self.mywrapper)
或者,只需使用
函数
获取必要的变量本身:

def the_function(self):
    a = entry1.get()
    b = entry2.get()
    c = entry3.get()
    d = entry4.get()
    #    Ensure a, b, c, and d are integers
并在没有lambda的情况下绑定该函数:

...command=self.the_function)
但是,这对您当前的代码没有帮助-当您确实对引用小部件感兴趣时,将几何体管理方法链接到小部件创建上会导致问题。小部件构造函数(
Button()
Entry()
等)将返回该小部件以供将来参考。但是,几何体管理方法(
grid()
pack()
,等等)只是作用于它们的小部件并返回
None
。这意味着您正在将
None
分配给
self.label1
self.entry1
,等等。将小部件创建与几何体管理分开:

self.label1 = Label(master, text="Entry 1")
self.label1.grid(row=0, sticky=E)

您现在可以使用实际的小部件了。

通常的解决方案是让您的按钮调用特定于该按钮的函数。该功能的任务是收集数据,然后对数据采取行动:

def __init__(...):
    ...
    self.run_button = Button(..., command=self.do_run)
    ...

def do_run(self):
    e1 = self.entry1.get()
    e2 = self.entry2.get()
    e3 = self.entry3.get()
    e4 = self.entry4.get()

    self.the_function(e1, e2, e3, e4)
您可以使用lambda或functools.partial,但这会带来缺点,但没有明显的优点。只要可能,使用实函数而不是lambda,您的代码将更易于编写、读取和维护


您还可以在函数
中调用
get()
方法。选择权在你。如果可以在多个上下文中使用_函数
,则将其与UI分离可能会很有用。如果唯一的目的是始终处理输入窗口小部件中的值,您可以跳过中间函数,只需使用
函数
获取值,然后使用它们。

。你在使用教程吗?我试图确定这个常见错误是否只有一个来源,或者每个新用户是否都是独立的受害者。马克,请在这里的评论中回答凯文的问题。请发布一个指向您正在使用的教程的链接,以便我们可以尝试防止其他人在将来遇到同样的问题。@Kevin-我通常不会错过几何方法链接的小部件分配,但我今天错过了。:)我会在回答中提到这一点。我引用的教程建议在我介绍的同一行中格式化小部件,该教程由NewBoston发布在YouTube上,标题为“PythonGUI with Tkinter-4-Grid Layout”。也许我更适合先学习一个完整的教程,然后再学习这个项目。有可靠的教程建议吗?从技术上讲,你可以做这个链接,它会显示小部件,但是当你想返回到这些小部件中的一个时,它就变得不合适了,比如获取一个
条目
小部件的内容。我喜欢,但这更多的是参考偶尔的例子,而不是完整的教程。我决定让
_函数
获取值,然后通过
命令
参数显式调用它,并重新格式化小部件的创建/操作,它就可以工作了。非常感谢。