Форум сайта python.su
0
столкнулся с непонятным мне явлением. помогите пожалуйста его понять(буду благодарен за объяснение на словах или хотя бы за ссылку на умную книжку)
была задача вставить несколько кнопок через цикл и привязать каждую кнопку к событию.
так не работает(так как на экран выводится всегда одно и то же название цвета)
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)
Офлайн
253
zlodiakОднако правильно все. В одном случае color из внешней области видимости, а в другом из внутренней, которая при создании инициализированна ссылкой на один из элементов slides
шайтан однако
Офлайн
19
Может тему в GUI создавать, есть же профильный форум.
Офлайн
58
zlodiakПоследнего, как я догадываюсь
так не работает(так как на экран выводится всегда одно и то же название цвета)

Отредактировано 4kpt_II (Фев. 8, 2014 17:05:48)
Офлайн
58
PanovSergeyzlodiak, наверное, не устраивают ответы, которые даются в той ветке…
Может тему в GUI создавать, есть же профильный форум.
Офлайн
0
4kpt_IIда нет, в той то ветке меня как раз полностью устраивают ответы
наверное, не устраивают ответы, которые даются в той ветке…
просто вопрос то про события всё таки, а не про граф.интерфейсОтредактировано zlodiak (Фев. 8, 2014 17:30:17)
Офлайн
0
4kpt_IIа как проще, если не секрет?..
P.S. Можно было значительно проще. Даже без lambda обойтись.
Офлайн
58
Конечно не секрет. Только пишите в следующий раз все-таки в 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)
Офлайн