Я не уверен, почему вы помещаете Button
s в Canvas
, и не совсем то, что вы пытаетесь сделать с двумя глобальными list
s - поэтому я оставил их и просто сделал command
функция print()
какой идентификатор кнопки теперь передается в качестве аргумента.
Тем не менее, вот исполняемый пример, который показывает, как передать дополнительные аргументы в функцию обработчика команд Button
, определив для нее аргумент по умолчанию с желаемым значением в нем при объявлении функции lambda
.
Хотя это также можно сделать с помощью partial
, как описано в @ Novel's answer , но этот подход, вероятно, является более распространенным способом, чем он, и более кратким, чем использование functools
. В любом случае вам не нужно использовать IntVar
, чтобы выполнить то, что вы хотите, поскольку теперь вы фактически передадите значение функции.
from tkinter import *
def button_placement(canvas):
xpos, ypos = 150, 25
for button_number in range(1, 11):
button = Button(canvas, width='5', height='2', text=button_number,
anchor=CENTER, command=
lambda id=button_number: button_action(id))
window = canvas.create_window(xpos, ypos, window=button)
ypos += 50
def button_action(button_identifier):
print('Button {} pressed'.format(button_identifier))
root = Tk()
canvas = Canvas(root, height=500)
button_placement(canvas)
canvas.pack()
canvas.mainloop()
Вот как это работает в моей системе Windows:
![screenshot showing buttons](https://i.stack.imgur.com/MLBvF.png)