Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 8, 2014 16:28:16

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

привязка событий через именованные аргументы lambda-функции

столкнулся с непонятным мне явлением. помогите пожалуйста его понять(буду благодарен за объяснение на словах или хотя бы за ссылку на умную книжку)

была задача вставить несколько кнопок через цикл и привязать каждую кнопку к событию.

так не работает(так как на экран выводится всегда одно и то же название цвета)

import tkinter
root = tkinter.Tk()
root.mainloop
slides = {
    'blue': 'active',
    'red': 'active',
    'green': 'unctive',
    'orange': 'active',
    'navy': 'active'
}
        
for (i, color) in enumerate(slides.keys()):
    item = tkinter.Button( root,
				    text=color,
				    width=20,
				    height=10,
				    relief='raised',
				    borderwidth=5,
				    bg=color
			    )
    item.bind('<Button-1>', lambda event: invertItem(i, color))
    item.pack(side='left')
def invertItem(i, color):
    print(i, color)
а так работает
import tkinter
root = tkinter.Tk()
root.mainloop
slides = {
    'blue': 'active',
    'red': 'active',
    'green': 'unctive',
    'orange': 'active',
    'navy': 'active'
}
        
for (i, color) in enumerate(slides.keys()):
    item = tkinter.Button( root,
				    text=color,
				    width=20,
				    height=10,
				    relief='raised',
				    borderwidth=5,
				    bg=color
			    )
    item.bind('<Button-1>', lambda event, i=i, color=color: invertItem(i, color))
    item.pack(side='left')
def invertItem(i, color):
    print(i, color)

разница только в добавлении lambda-функции именованных аргументов… шайтан однако

Офлайн

#2 Фев. 8, 2014 16:36:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

привязка событий через именованные аргументы lambda-функции

zlodiak
шайтан однако
Однако правильно все. В одном случае color из внешней области видимости, а в другом из внутренней, которая при создании инициализированна ссылкой на один из элементов slides



Офлайн

#3 Фев. 8, 2014 16:39:39

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

привязка событий через именованные аргументы lambda-функции

Может тему в GUI создавать, есть же профильный форум.

Офлайн

#4 Фев. 8, 2014 17:00:10

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

привязка событий через именованные аргументы lambda-функции

zlodiak
так не работает(так как на экран выводится всегда одно и то же название цвета)
Последнего, как я догадываюсь

P.S. Можно было значительно проще. Даже без lambda обойтись.

Отредактировано 4kpt_II (Фев. 8, 2014 17:05:48)

Офлайн

#5 Фев. 8, 2014 17:04:21

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

привязка событий через именованные аргументы lambda-функции

PanovSergey
Может тему в GUI создавать, есть же профильный форум.
zlodiak, наверное, не устраивают ответы, которые даются в той ветке…

Офлайн

#6 Фев. 8, 2014 17:24:44

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

привязка событий через именованные аргументы lambda-функции

4kpt_II
наверное, не устраивают ответы, которые даются в той ветке…
да нет, в той то ветке меня как раз полностью устраивают ответы просто вопрос то про события всё таки, а не про граф.интерфейс

хотя это странно. на форуме 2 дня, а уже несколько раз послали в GUI

Отредактировано zlodiak (Фев. 8, 2014 17:30:17)

Офлайн

#7 Фев. 8, 2014 17:29:09

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

привязка событий через именованные аргументы lambda-функции

4kpt_II
P.S. Можно было значительно проще. Даже без lambda обойтись.
а как проще, если не секрет?..

Офлайн

#8 Фев. 8, 2014 17:35:35

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

привязка событий через именованные аргументы lambda-функции

Конечно не секрет. Только пишите в следующий раз все-таки в GUI

Я Вам раньше писал, что event давить нежелательно. Я не знаю случаев, когда была бы необходимость его тушить. А все потому, что с event передается куча всякой полезной информации. Перепишу Ваш код так, чтобы он работал без lambda и был правильнее.

import tkinter
root = tkinter.Tk()
slides = {
    'blue': 'active',
    'red': 'active',
    'green': 'unctive',
    'orange': 'active',
    'navy': 'active'
}
def invertItem(event):
    print(event.widget["text"])
for (i, color) in enumerate(slides.keys()):
    item = tkinter.Button( root,
				    text=color,
				    width=20,
				    height=10,
				    relief='raised',
				    borderwidth=5,
				    bg=color
			    )
    item.bind('<Button-1>', invertItem)
    item.pack(side='left')
root.mainloop()

Будут еще вопросы - пишите…

Отредактировано 4kpt_II (Фев. 8, 2014 17:40:53)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version