Здесь абсолютно не нужно использовать exec()
или eval()
.
- Функции не должны называться последовательно. Вы также можете хранить функциональные объекты в переменной цикла и использовать эту переменную цикла для создания хука tkinter.
- Вы можете создавать функции со связанным параметром без
exec
, используя замыкание или просто связывая параметр в лямбда-функции или functools.partial()
.
Так что если у вас есть цикл с возрастающим значением strategicpoint
, я бы просто сделал это:
def set_strategy(point):
global strategy
strategy = point
buttons = []
for strategicpoint in range(1, number_of_points + 1):
imgx = tk.Button(win, image=towert, command=lambda point=strategicpoint: set_strategy(point))
buttons.append(imgx)
Часть lambda point=...
связывает текущее значение цикла как значение по умолчанию для аргумента point
нового функционального объекта, который создает lambda
. Когда эта функция вызывается без аргументов (как это было бы сделано при нажатии кнопки), тогда новая функция использует целочисленное значение, которое было присвоено strategicpoint
в то время, чтобы вызвать set_strategy(point)
.
Вы также можете использовать замыкание, локальную переменную во внешней функции, которую использует внутренняя функция. Вложенные, внутренние функции внутри внешней функции создаются каждый раз, когда вы вызываете внешнюю функцию, поэтому они отделены от других объектов функций, созданных той же внешней функцией:
def create_strategy_command(strategypoint):
def set_strategy():
global strategy
strategy = strategypoint
return set_strategy
затем при создании кнопок используйте:
imgx = tk.Button(win, image=towert, command=create_strategy_command(strategicpoint))
Обратите внимание, что вызов функции create_strategy_command()
возвращает здесь новую функцию, используемую в качестве команды кнопки.