所以我试图创建一个函数,使用for循环自动创建10个按钮并将它们定位在屏幕上并将它们命名为1到10.然后按下在创建过程中传递的参数指示另一个按钮被按下的功能并将不同的项目添加到列表中。
def button_placement():
mover = 227
button_number = 1
for items in range(10):
button_number = IntVar()
Button(canvas1, width="5", height="2", textvariable=button_number,
command= lambda: button_action(button_number)).place(x=150, y=mover)
mover = mover + 50
button_number = button_number +1
def button_action(button_identifier):
global list2
global list1
for buttons in range(1,10):
if button_identifier == buttons:
if len(list1) > 1:
list2.append(list1[buttons])
列表1和列表2中已包含项目。请原谅全局变量。目前,button_placement中的IntVar操作数有问题。在此先感谢!
答案 0 :(得分:1)
在这种情况下你不能使用lambda
,因为它的后期绑定。请改用functools.partial
。此外,您不需要IntVar,使用普通的python整数。
from functools import partial
def button_placement():
mover = 227
for button_number in range(10):
btn = Button(canvas1, width="5", height="2", text=button_number,
command= partial(button_action, button_number))
btn.place(x=150, y=mover)
mover = mover + 50
答案 1 :(得分:1)
我不确定你为什么要将Button
放在Canvas
上,也不确定你要对这两个全球{{1}做什么s-so我把它们排除在外,只是将list
函数command
作为参数传递给它的按钮标识符。
那就是说,这里是一个可运行的例子,它展示了如何通过将额外的参数传递给print()
的命令处理函数来定义它,使其具有一个带有所需值的默认参数。声明Button
函数。
虽然也可以使用@Novel's answer中描述的lambda
来完成此操作,但这种方法可能是更常见的方式 - 并且比使用{{1}更简洁}。无论哪种方式,您都不需要使用partial
来完成您想要的任务,因为您现在可以有效地将值传递给函数。
functools
以下是我在Windows系统上运行的内容: