Как перебором списка назначить разные функции на Button в tkinter
import tkinter
w = tkinter.Tk()
lst = ['Hello', 'World']
def prt(i):
print(i)
for i in lst:
b = tkinter.Button(master=w, text=i, command=prt(i))
b.pack()
w.mainloop()
Возможно ли сделать так, чтобы при переборе списка для каждого его элемента создавалась кнопка с текстом элемента списка, а потом этот же элемент передавался в функцию, привязанную к кнопке и при нажатии на кнопку выполнялась функция?
При выполнении кода появляется окошко с двумя кнопками, в консоли сразу выполняются функции, при нажатии на кнопки ничего не происходит.
Пробовал обращаться через индекс элемента:
for i in range(len(lst)):
результат тот же.
Ответы (3 шт):
Попробуйте так:
import tkinter
w = tkinter.Tk()
lst = ['Hello', 'World']
def prt(i):
print(i)
for i in lst:
# +++ vvvvvvvvvvvvvvvvvv <----
b = tkinter.Button(master=w, text=i, command=lambda i=i: prt(i))
b.pack()
w.mainloop()
Я решил эту задачу через DataFrame.
from tkinter import *
import pandas as pd
создаем кортежи данных
rows = ('0', '0', '1', '1')
columns = ('0', '1', '0', '1')
buttons = ('7', '8', '9', '/')
формирую данные в массив
df = pd.DataFrame({'btn': buttons, 'r': rows, 'c': columns})
ap = Tk()
ap.title('as')
создаем простейший цикл, в котором значения присваиваются по индексу массива, данные которого очень легко редактировать.
for index in range(len(df)):
b = Button(ap, text=df['btn'][index])
b.grid(row=df['r'][index], column=df['c'][index])
ap.mainloop()
При запуске мы получим программу с 4-мя кнопками, расположенными по сетке в 2 ряда и 2 колонки и у которых уже есть присвоенное значение. Кнопкам можно присваивать нужную команду. На эти кнопки можно повесить одну команду и управлять через условие if-elif-else
Функции в python это "полноправные граждане" - игра слов при переводе с английского "functions are a first-class type" - "functions are first class citizens". C ними вы можете делать все, что и строками, цифрами, колекциями. То есть составлять из них списки, отправлять их как аргументы в другие функции и т. д.
import tkinter
w = tkinter.Tk()
lst = ['Hello', 'World']
btns = []
def prt1():
print(lst[0])
def prt2():
print(lst[1])
# Здесь мы пробегаемся по кортежу из функций.
for i, prt in enumerate((prt1, prt2)):
b = tkinter.Button(master=w, text=lst[i], command=prt)
b.pack()
btns.append(b) # сохраняем кнопки в список,
# чтобы к ним можно было бы в будущем обратиться.
print(btns)
w.mainloop()
Даже объект "кнопка" подчиняется "законодательству" Pytnon. Я сохранил их в списке, хотя удобней было бы в словаре с ключом по имени соответствующей функции. Но это уже другая история...
[<tkinter.Button object .!button>, <tkinter.Button object .!button2>]
