Форум сайта python.su
здравствуйте, у меня есть глупый, вопрос но я в ступоре чего то
использую ткинтер
допустим у меня есть массив(в данном случае набор) лейблов (добавляются по ходу выполнения программы)
и есть массив кнопок, который так же пополняется ими динамически по ходу программы (стоят напротив каждого из лейблов) => номер кнопки в массиве = номеру лейбла в массиве напротив и наоборот
по сути - создаю новый лейбл (новый элемент массива) и напротив него новую кнопку
в лейблах записаны некоторые числа
как мне по нажатию кнопки n увеличить значение лейбла n?????
просто если создать функцию как параметр у которой именно номер n и в ней модифицировать лейбл n, то при привязке к кнопке этой функции если указывать передаваемый параметр, то функция почему то выполнится при создании кнопки, все изменит, а потом на нажатие кнопка никак не реагирует, если на нажатие привязать функцию без параметра то она выполняется каждый раз при нажатии, но параметр соответственно не передает
пробовал метод bind - та же фигня, привязываем функцию без параметра - все нормально, с ним - выполняется при создании кнопки и дальше не вызывается при нажатии
Офлайн
а код приложить воспитание не позволяет?
Офлайн
да нет, просто не подумал об этом - вот этот участок кода
for i in range(0,len(dictDataShows)):
step=step+0.05
lbTitle+=)] #выводим название сериала
lbTitle.place(anchor=NW, relx=0, rely=step)
step+=0.05
lbTotal+=))] #количество серий
lbTotal.place(anchor=NW, relx=0, rely=step)
step+=0.05
lbLeft+=))] #и сколько осталось
lbLeft.place(anchor=NW, relx=0, rely=step)
step+=0.05
def plus_serie(i):
print (i) #остлеживаем номер кнопки
btAdd+= #кнопка добавления просмотренной серии
btAdd.place(anchor=E, relx=0.8, rely=step-0.05)
дак вот в функцию plus_serie параметр с номером не передать
Офлайн
по идее по нажатию одной из кнопко должно уменьшаться количество непросмотренных серий в конкретном сериале
Офлайн
for i in range(len(dictDataShows)):
# ...
def plus_serie(i):
def do():
print (i) #остлеживаем номер кнопки
return do
btAdd+=[Button(fr, text="+",command=plus_serie(i))] #кнопка добавления просмотренной серии
btAdd[i].place(anchor=E, relx=0.8, rely=step-0.05)
Офлайн
спасибо
Офлайн
Можно сократить до lambda: do_what_i_whant_function_with_param(i)
Офлайн
def plus_serie(i):
def do():
print (i) #остлеживаем номер кнопки
return do
Офлайн
Параметр command принимает функцию, которую при нажатии вызывает (у кнопки) без аргументов.
Офлайн
Griffon, лямбды - в топку. К тому же именно сейчас так сократить нельзя - привязка собьется, будет у всех только последнее значение i. Почему - подумайте сами.
Вообще-то уже есть functools.partial - но полезно знать, как оно устроено внутри.
Офлайн