使用python的Tkinter。为什么这里需要*args?

2024-04-26 06:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我今天一直在搞tk,我在官方教程中看到了这段代码:

from tkinter import * 
from tkinter import ttk 

def calculate(*args): 
       try: 
            value = float(feet.get()) 
            meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0) 
       except ValueError: 
            pass

root = Tk() 
root.title("Feet to Meters") 

mainframe = ttk.Frame(root, padding="3 3 12 12") 
mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) 
mainframe.columnconfigure(0, weight=1) 
mainframe.rowconfigure(0, weight=1) 

feet = StringVar() 
meters = StringVar() 
feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet) 
feet_entry.grid(column=2, row=1, sticky=(W, E)) 
ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=3, row=3, sticky=W)
ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W) 
ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E)
ttk.Label(mainframe, text="meters").grid(column=3, row=2, sticky=W) 

for child in mainframe.winfo_children():
    child.grid_configure(padx=5, pady=5) 

feet_entry.focus() 
root.bind('<Return>', calculate) 

root.mainloop()

我不明白为什么需要calculate函数中的*args参数。如果有人能向我解释它的用处,我将非常感激!在


Tags: textfromtkintercolumnrootlabelgridrow
2条回答

python*arg模式允许通过数组访问方法的参数(如果调用calculate(1, "foo"),arg将是[1, "foo"]1。这是python实现variadic function的方法。在

这里,calculate回调在两个绑定中使用,第一个是Button(..., command=calculate),它希望在没有参数的情况下调用回调,第二个绑定使用root.bind('<Return>', calculate),它将使用事件对象作为参数调用calculate。使calculate变元函数允许使用同一个函数,有时不带参数调用,有时用一个参数调用。在

不使用此模式将导致以下类型的错误之一:

TypeError: calculate() takes no arguments (1 given)
TypeError: calculate() takes exactly 1 argument (0 given)

或者需要定义第二个调用实际回调的函数(删除事件参数,或者创建一个伪参数)。在


1*表示将参数存储为list,args是参数的名称,可以是任何您想要的,但通常是{}。

这是因为calculate是一个可以接受参数的回调函数。实际上不需要使用*args(您可以确切地指定它需要多少个参数,以及使用哪些参数),但是当您不关心这些参数是什么时,使用*args是一个常见的约定,这允许回调接受任意数量的参数而不会导致错误。在

相关问题 更多 >