2

我正在尝试编写一个程序,它将显示 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 个条目并将它们传递给另一个名为the_function. 所做的只是根据 4个the_function条目的值打印出一些东西。所以我剩下的代码如下所示:

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.the_function

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

4

2 回答 2

3

您走在正确的轨道上 -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)

或者,只需the_function获取必要的变量本身:

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。这意味着您要分配Noneself.label1self.entry1等。将小部件创建与几何管理分开:

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

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

于 2015-08-17T17:23:40.893 回答
0

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

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()调用the_function. 这个选择由你。如果the_function可以在多个上下文中使用,那么将其与 UI 分离会很有用。如果唯一的目的是始终处理来自条目小部件的值,您可以跳过中间函数并简单地the_function获取值然后使用它们。

于 2015-08-17T22:14:19.470 回答