Найти - Пользователи
Полная версия: привязка к кнопке функции с аргументом
Начало » Python для новичков » привязка к кнопке функции с аргументом
1 2
kukumb3r
здравствуйте, у меня есть глупый, вопрос но я в ступоре чего то

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

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

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

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

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

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

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
по идее по нажатию одной из кнопко должно уменьшаться количество непросмотренных серий в конкретном сериале
Андрей Светлов
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
спасибо
Griffon
Можно сократить до lambda: do_what_i_whant_function_with_param(i)
Zubchick
    def plus_serie(i):
def do():
print (i) #остлеживаем номер кнопки
return do
А зачем возвращать функцию?
Griffon
Параметр command принимает функцию, которую при нажатии вызывает (у кнопки) без аргументов.
Андрей Светлов
Griffon, лямбды - в топку. К тому же именно сейчас так сократить нельзя - привязка собьется, будет у всех только последнее значение i. Почему - подумайте сами.

Вообще-то уже есть functools.partial - но полезно знать, как оно устроено внутри.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB