kukumb3r
Апрель 11, 2010 19:42:19
здравствуйте, у меня есть глупый, вопрос но я в ступоре чего то
использую ткинтер
допустим у меня есть массив(в данном случае набор) лейблов (добавляются по ходу выполнения программы)
и есть массив кнопок, который так же пополняется ими динамически по ходу программы (стоят напротив каждого из лейблов) => номер кнопки в массиве = номеру лейбла в массиве напротив и наоборот
по сути - создаю новый лейбл (новый элемент массива) и напротив него новую кнопку
в лейблах записаны некоторые числа
как мне по нажатию кнопки n увеличить значение лейбла n?????
просто если создать функцию как параметр у которой именно номер n и в ней модифицировать лейбл n, то при привязке к кнопке этой функции если указывать передаваемый параметр, то функция почему то выполнится при создании кнопки, все изменит, а потом на нажатие кнопка никак не реагирует, если на нажатие привязать функцию без параметра то она выполняется каждый раз при нажатии, но параметр соответственно не передает
пробовал метод bind - та же фигня, привязываем функцию без параметра - все нормально, с ним - выполняется при создании кнопки и дальше не вызывается при нажатии
Андрей Светлов
Апрель 11, 2010 21:01:41
а код приложить воспитание не позволяет?
kukumb3r
Апрель 11, 2010 21:30:18
да нет, просто не подумал об этом - вот этот участок кода
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 параметр с номером не передать
kukumb3r
Апрель 11, 2010 21:32:49
по идее по нажатию одной из кнопко должно уменьшаться количество непросмотренных серий в конкретном сериале
Андрей Светлов
Апрель 11, 2010 22:49:26
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)
kukumb3r
Апрель 12, 2010 00:37:11
спасибо
Griffon
Апрель 12, 2010 13:01:41
Можно сократить до lambda: do_what_i_whant_function_with_param(i)
Zubchick
Апрель 12, 2010 13:45:26
def plus_serie(i):
def do():
print (i) #остлеживаем номер кнопки
return do
А зачем возвращать функцию?
Griffon
Апрель 12, 2010 14:21:50
Параметр command принимает функцию, которую при нажатии вызывает (у кнопки) без аргументов.
Андрей Светлов
Апрель 12, 2010 14:40:06
Griffon, лямбды - в топку. К тому же именно сейчас так сократить нельзя - привязка собьется, будет у всех только последнее значение i. Почему - подумайте сами.
Вообще-то уже есть functools.partial - но полезно знать, как оно устроено внутри.