python - How to set a different command to each button, when buttons are created without names -


this question has answer here:

how can set 10 buttons each have different command using code:

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

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

current code:

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]()     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) 

when run causes error.

a callback callbacks!

probably not elegant solution can have 1 main function decides function use based on argument given button.

you need decide each value of n call.

edit: changed code answer comment

import tkinter  keyboard = tkinter.tk() line1 = ['q','w','e','r','t','y','u','i','o','p'] buttons = [] def func0():      print("this 0's function")     buttons[0].destroy()  def func1():      print("this 1's function")     buttons[1].destroy()  def funcx(n):       print("you idea...")     buttons[n].destroy()  functions = [lambda: func0(), lambda: func1(), lambda n: funcx(n)]  def selectcallback(n):      global functions     global buttons     # if `functions` filled out elements can neglect      # if/else , call `functions[n]()`     if n > 1:         functions[2](n)     else:         functions[n]()  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() 

important points:

-must keep reference buttons able delete them (buttons)

-must call .grid() on separate line not return none should button.

-if want delete buttons, not require different function each. example meant illustrate how have 10 different functions callbacks.

-additionally, example simplified: buttons [2:9] call 1 function , pass index don't have write out 10 functions. if want different function performs different operation each button, fill out functions list , remove if/else construct within selectcallback(n), , access each function directly index.


Comments