我最近一直在使用tkinter和Python,我一直对在tkinter中创建对象实例时传递参数的方式感到困惑。
当我自己创建一个类时,每个可以传递的参数都会传递 。但是,在tkinter中创建任何窗口小部件的实例时,并不是每个可能的参数都必须立即传递。它们每个都默认为特定值。请考虑用于创建画布小部件的代码:
canvas = tkinter.Canvas(root, width = 400, height = 250)
值(400,25)甚至不需要按顺序传递,它们由值之前的名称(宽度,高度)标识。我可以指定其他值(例如:背景,边框),但没有必要,因为默认值很好。
我已经搜索了很长时间试图找到答案,但是,由于我不完全确定如何称呼这些特殊论点,所以很难找到任何关于此的文章。
答案 0 :(得分:3)
有一些叫做默认参数
的东西def default_parameters(var1 = "cabbage"):
print var1
default_parameters(var1 = "salad") # salad
default_parameters("salad") # salad
default_parameters() # cabbage
default_parameters("salad", "cabbage") # Error! Expects only one parameter
这里,如果没有传递参数,则假定定义中指定的默认值。
如果您想接受许多参数,可以在参数部分解压缩它们,如
def many_parameters(var1, var2 = "cabbage", *args):
print var1, var2, args
many_parameters("salad", "cabbage", "rabbit", "ninja", "puppy")
# salad cabbage ('rabbit', 'ninja', 'puppy')
many_parameters("salad", "cabbage", "rabbit", "ninja")
# salad cabbage ('rabbit', 'ninja')
many_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',)
many_parameters("salad", "cabbage")
# salad cabbage
many_parameters("salad")
# salad cabbage
many_parameters()
# many_parameters() takes at least 1 argument (0 given)
many_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
many_parameters("salad", "puppy", var2 = "ninja")
# many_parameters() got multiple values for keyword argument 'var2'
此处,在第一种情况下,salad
和cabbage
已分配给var1
和var2
,但其余值已分配给args
作为一个元组。
第二和第三种情况与第一种情况相同。
第四种情况没有额外的参数,因此args
将为空。
第五种情况没有额外的参数,var2
没有值,因此args
将为空,并假定cabbage
的默认值(var2
)
在第六种情况下,var1
未提供任何默认值。因此,它失败并出现at-least 1 argument expected
错误。
在第七种情况下,在未命名的参数之前使用var2
(命名变量)。这在Python中是错误的。
在第八种情况下,var2
(命名变量)和puppy
(位置参数)都设置为var2
。现在,Python无法确定var2
使用哪个值。所以,它失败了。
在前面的例子中,我们看到了如何处理默认参数和命名参数。现在,命名参数也称为关键字参数,通常表示为**kwargs
,它实际上是所有命名参数的键值对的字典。 注意:默认参数不计入关键字参数。
def all_parameters(var1, var2 = "cabbage", *args, **kwargs):
print var1, var2, args, kwargs
all_parameters("salad", "cabbage", "rabbit")
# salad cabbage ('rabbit',) {}
all_parameters("salad", "cabbage")
# salad cabbage () {}
all_parameters("salad")
# salad cabbage () {}
all_parameters("salad", var2 = "ninja", "puppy")
# SyntaxError: non-keyword arg after keyword arg
all_parameters("salad", "puppy", var2 = "ninja")
# all_parameters() got multiple values for keyword argument 'var2'
all_parameters("salad", moderator="jonclements", python="martijinpieters")
# salad cabbage () {'moderator': 'jonclements', 'python': 'martijinpieters'}
我相信,除了最后一项之外,前两个例子已经涵盖了所有其他项目。在最后一种情况下,所有非默认但命名的参数都存储在kwargs
字典中。
注意:请记住函数定义中*
中的*args
和**
中的**kwargs
。它们负责传递给函数的参数的打包。
答案 1 :(得分:1)
我们举一个例子。
def spam(a=1, b=2, c=3):
print a, b, c
此函数有三个参数,所有参数都有默认值。所以我可以在很多方面使用这个功能。
>>> spam() # uses the default values
1 2 3
>>> spam(3) # use default for b and c
3 2 3
>>> spam(c=4, b=2, a=6) # explicitly assign values
6 2 4
>>> spam(b=7) # only assign b, use defaults for a and c
1 7 3
Canvas小部件会发生类似的事情。你可以在这里看到参考: https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/canvas.html
答案 2 :(得分:0)
声明方法时,您可以指定默认值。例如:
def __init__(self, a, b, c=True, d="default value"):
....