如何设置它以便所有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)
运行此操作时会导致错误。
答案 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)
构造,并直接访问每个函数索引。