如何让 Bind 和 Command 在 tkinter 中做同样的事情?
How do I make Bind and Command do the same thing in tkinter?
我有一个带有输入字段和验证按钮的 tkinter GUI。我想在条目中按下某个键或单击按钮时调用相同的函数。
问题是,对于条目上的绑定方法,我需要一个 "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()
使用这段代码,当我使用按钮时,没问题,它打印,但是当我使用绑定时,它 returns:
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.")
有没有办法让.bind
和command
共享同一个函数?
您可以编写函数,使其接受任意数量的参数:
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())
将此添加到您的绑定中:
input_widget.bind("<Return>", lambda event: function())
事件绑定都需要一个自动传递给函数的事件参数。通过使用带有参数 event 的 lambda;您可以接受这个 "event" 变量并基本上丢弃它并执行 function()
中的任何操作
我有一个带有输入字段和验证按钮的 tkinter GUI。我想在条目中按下某个键或单击按钮时调用相同的函数。
问题是,对于条目上的绑定方法,我需要一个 "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()
使用这段代码,当我使用按钮时,没问题,它打印,但是当我使用绑定时,它 returns:
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.")
有没有办法让.bind
和command
共享同一个函数?
您可以编写函数,使其接受任意数量的参数:
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())
将此添加到您的绑定中:
input_widget.bind("<Return>", lambda event: function())
事件绑定都需要一个自动传递给函数的事件参数。通过使用带有参数 event 的 lambda;您可以接受这个 "event" 变量并基本上丢弃它并执行 function()