4

我有一个带有Entry小部件和提交的 GUI Button

我基本上是在尝试使用get()和打印小部件内的值Entry。我想通过单击提交 或在键盘上Buttonenterreturn来执行此操作。

我尝试将"<Return>"事件与按下提交按钮时调用的相同函数绑定:

self.bind("<Return>", self.enterSubmit)

但我得到一个错误:

需要 2 个参数

但是self.enterSubmitfunction 只接受一个,因为对于 the 的command选项Button只需要一个。

为了解决这个问题,我尝试创建 2 个具有相同功能的函数,它们只是具有不同数量的参数。

有没有更有效的方法来解决这个问题?

4

2 回答 2

10

您可以创建一个接受任意数量参数的函数,如下所示:

def clickOrEnterSubmit(self, *args):
    #code goes here

这称为任意参数列表。调用者可以随意传入任意数量的参数,并且它们都将被打包到args元组中。Enter 绑定可以传入它的 1 个event对象,而 click 命令可以不传入任何参数。

这是一个最小的 Tkinter 示例:

from tkinter import *

def on_click(*args):
    print("frob called with {} arguments".format(len(args)))

root = Tk()
root.bind("<Return>", on_click)
b = Button(root, text="Click Me", command=on_click)
b.pack()
root.mainloop()

结果,按下Enter并单击按钮后:

frob called with 1 arguments
frob called with 0 arguments

如果您不愿意更改回调函数的签名,可以将要绑定的函数包装在lambda表达式中,并丢弃未使用的变量:

from tkinter import *

def on_click():
    print("on_click was called!")

root = Tk()

# The callback will pass in the Event variable, 
# but we won't send it to `on_click`
root.bind("<Return>", lambda event: on_click())
b = Button(root, text="Click Me", command=frob)
b.pack()

root.mainloop()
于 2013-07-19T13:19:41.753 回答
3

您还可以为None参数分配一个默认值(例如)event。例如:

import tkinter as tk

def on_click(event=None):
    if event is None:
        print("You clicked the button")
    else:
        print("You pressed enter")


root = tk.Tk()
root.bind("<Return>", on_click)
b = tk.Button(root, text='Click Me!', command=on_click)
b.pack()
root.mainloop()
于 2015-03-11T18:20:14.407 回答