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

时间:2014-02-08 22:30:51

标签: python tkinter

所以今天我一直在搞乱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()

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

这里,calculate回调用于两个绑定,首先是Button(..., command=calculate),期望回调被调用而不带参数,第二个用root.bind('<Return>', calculate),它将使用事件对象调用calculate论点。使计算变量函数允许使用相同的函数,有时称为无参数,在其他时间使用一个参数调用。

不使用此模式会导致此类错误之一:

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

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


<子> 1. *表示将参数存储为列表,args是参数的名称,可以是您想要的任何内容,但大多数情况下按惯例args