如何在没有名称的情况下创建按钮时,如何为每个按钮设置不同的命令

时间:2015-07-09 16:15:43

标签: python python-3.x tkinter

如何设置它以便所有10个按钮都使用此代码具有不同的命令:

第1行= [' q',' w'' e'' r'' t' ' Y'' U'' I'' O'' p&#39]

for n in range(10):
        tkinter.Button(keyboard, text = line1[n], command = line1[n]).grid(column = n + 1, row = 0, padx = 1, pady = 1)

当前代码:

line1 = ['q','w','e','r','t','y','u','i','o','p']

functions = [lambda: q(), lambda: w(), lambda: e(), lambda: r(), lambda: t(), lambda: y(), lambda: u(), lambda: i(), lambda: o(), lambda: p()]
    buttons = []
    def q():
        buttons[0].destroy()
    def selectCallback(n):
        global functions
        global buttons
        if n > 1:
            functions[2](n)
        else:
            functions[n]()
    for n in range(10):
        buttons.append(tkinter.Button(keyboard, text = line1[n], command = lambda n = n: selectCallback(n)))
        buttons[n].grid(column = n + 1, row = 0, padx = 1, pady = 1)

运行此操作时会导致错误。

1 个答案:

答案 0 :(得分:0)

回调回调!

可能不是最优雅的解决方案,但你可以有一个主要功能,根据按钮给出的参数决定使用哪个功能。

您需要确定n的每个值将调用的内容。

编辑:更改了代码回答评论

import Tkinter

keyboard = Tkinter.Tk()
line1 = ['q','w','e','r','t','y','u','i','o','p']
buttons = []
def func0():

    print("This could be 0's function")
    buttons[0].destroy()

def func1():

    print("This could be 1's function")
    buttons[1].destroy()

def funcX(n):


    print("You get the idea...")
    buttons[n].destroy()

functions = [lambda: func0(), lambda: func1(), lambda n: funcX(n)]

def selectCallback(n):

    global functions
    global buttons
    # If `functions` is filled out for all elements you can neglect this 
    # if/else and simply call `functions[n]()`
    if n > 1:
        functions[2](n)
    else:
        functions[n]()

for n in range(10):
        buttons.append(Tkinter.Button(keyboard, text = line1[n], command = lambda n = n: selectCallback(n)))
        buttons[n].grid(column = n + 1, row = 0, padx = 1, pady = 1)

keyboard.mainloop()

要点

- 必须保留对按钮的引用才能删除它们(buttons

- 必须在单独的行上致电.grid(),以便它不会返回None Button

- 如果您只想删除按钮,则不需要为每个按钮使用不同的功能。此示例旨在说明如何将10个不同的函数作为回调。

- 另外,我的例子是简化的:对于按钮[2:9]我只调用一个函数并传递索引,这样我就不必写出10个函数。如果您想对每个按钮执行不同的操作,请正确填写functions列表并删除if/else中的selectCallback(n)构造,并直接访问每个函数索引。