Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2010 19:42:19

kukumb3r
От:
Зарегистрирован: 2010-04-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

здравствуйте, у меня есть глупый, вопрос но я в ступоре чего то

использую ткинтер

допустим у меня есть массив(в данном случае набор) лейблов (добавляются по ходу выполнения программы)
и есть массив кнопок, который так же пополняется ими динамически по ходу программы (стоят напротив каждого из лейблов) => номер кнопки в массиве = номеру лейбла в массиве напротив и наоборот
по сути - создаю новый лейбл (новый элемент массива) и напротив него новую кнопку

в лейблах записаны некоторые числа

как мне по нажатию кнопки n увеличить значение лейбла n?????

просто если создать функцию как параметр у которой именно номер n и в ней модифицировать лейбл n, то при привязке к кнопке этой функции если указывать передаваемый параметр, то функция почему то выполнится при создании кнопки, все изменит, а потом на нажатие кнопка никак не реагирует, если на нажатие привязать функцию без параметра то она выполняется каждый раз при нажатии, но параметр соответственно не передает

пробовал метод bind - та же фигня, привязываем функцию без параметра - все нормально, с ним - выполняется при создании кнопки и дальше не вызывается при нажатии



Офлайн

#2 Апрель 11, 2010 21:01:41

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

привязка к кнопке функции с аргументом

а код приложить воспитание не позволяет?



Офлайн

#3 Апрель 11, 2010 21:30:18

kukumb3r
От:
Зарегистрирован: 2010-04-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

да нет, просто не подумал об этом - вот этот участок кода

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 параметр с номером не передать



Офлайн

#4 Апрель 11, 2010 21:32:49

kukumb3r
От:
Зарегистрирован: 2010-04-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

по идее по нажатию одной из кнопко должно уменьшаться количество непросмотренных серий в конкретном сериале



Офлайн

#5 Апрель 11, 2010 22:49:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

привязка к кнопке функции с аргументом

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)



Офлайн

#6 Апрель 12, 2010 00:37:11

kukumb3r
От:
Зарегистрирован: 2010-04-11
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

спасибо



Офлайн

#7 Апрель 12, 2010 13:01:41

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

Можно сократить до lambda: do_what_i_whant_function_with_param(i)



Офлайн

#8 Апрель 12, 2010 13:45:26

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

    def plus_serie(i):
def do():
print (i) #остлеживаем номер кнопки
return do
А зачем возвращать функцию?



Офлайн

#9 Апрель 12, 2010 14:21:50

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

привязка к кнопке функции с аргументом

Параметр command принимает функцию, которую при нажатии вызывает (у кнопки) без аргументов.



Офлайн

#10 Апрель 12, 2010 14:40:06

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

привязка к кнопке функции с аргументом

Griffon, лямбды - в топку. К тому же именно сейчас так сократить нельзя - привязка собьется, будет у всех только последнее значение i. Почему - подумайте сами.

Вообще-то уже есть functools.partial - но полезно знать, как оно устроено внутри.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version