使用for循环生成多个按钮,并能够区分它们并在鼠标单击时运行单独的代码。

时间:2018-05-16 00:23:25

标签: python tkinter

所以我试图创建一个函数,使用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操作数有问题。在此先感谢!

2 个答案:

答案 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系统上运行的内容:

screenshot showing buttons