如何让Bind和Command在tkinter中做同样的事情?

时间:2015-06-17 12:39:15

标签: python tkinter bind tkinter-entry

我有一个带有输入字段和验证按钮的tkinter GUI。当我按下条目中的某个键或单击按钮时,我想调用相同的功能。

问题是,对于条目上的bind方法,我需要一个“self”参数来使我的函数工作,但不需要使用按钮。

以下是简化代码:

from tkinter import *
import tkinter.messagebox
import tkinter.filedialog


def function():
    print("Here are some words.")

my_window = Tk()

text = StringVar()
input_widget = Entry(my_window, textvariable = text) #We create an input widget.
input_widget.bind("<Return>", function)

benjamin = Button(my_window, text ='Print', command = function) #We create another widget, a 
# button that sends the same function as pressing <Return> key.

input_widget.grid(row = 0, column = 0) #We use grid to place our widgets.
benjamin.grid(row = 0, column = 1)


my_window.mainloop()

使用此代码,当我使用按钮时,没有问题,它会打印,但是当我使用bind时,它会返回:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\"blablabla"\tkinter\__init__.py, line 1533, in __call__
    return self.func(*args)
TypeError: function() takes 0 positionnal arguments but 1 was given

我可以通过为按钮调用一个函数来使其工作,而另一个函数调用具有self参数的条目:

def function2(self):
    print("It works with this function.")

有没有办法让.bindcommand共享相同的功能?

2 个答案:

答案 0 :(得分:1)

您可以编写函数,以便它可以使用任意数量的参数:

def function(*args):
    #args is now a tuple containing every argument sent to this function
    print("Here are some words.")

现在您可以使用0,1或任何其他数量的参数成功调用该函数。

或者,您可以保持您的功能不变,并使用lambda丢弃未使用的self值:

input_widget.bind("<Return>", lambda x: function())

答案 1 :(得分:0)

将此添加到您的绑定中:

input_widget.bind("<Return>", lambda event: function())

事件绑定都需要一个自动传递给函数的事件参数。通过将lambda与参数事件一起使用;你可以参加这个&#34;活动&#34;变量并且基本上丢弃它并执行function()

中的任何操作