Форум сайта python.su
0
День добрый. Подскажите пожалуйста, как решить проблему:
есть массив кнопок в Tkinter (100500 штук), по одной из них кликнули, но не могу узнать, по какой. Подскажите, как получить хоть какую информацию о ней? В идеале - индекс в массиве.
Заранее спасибо)
Офлайн
103
давайте код
Офлайн
49
Берем стандартное многокнопочное приложение (калькулятор) и смотрим.
#!/usr/bin/env python3 from tkinter import * def frame(root, side): w = Frame(root) w.pack(side=side, expand=YES, fill=BOTH) return w def button(root, side, text, command=None): w = Button(root, text=text, command=command) w.pack(side=side, expand=YES, fill=BOTH) return w class Calculator(Frame): def __init__(self): Frame.__init__(self) self.option_add('*Font', 'Verdana 12 bold') self.pack(expand=YES, fill=BOTH) self.master.title('Simple Calculator') self.master.iconname("calc1") display = StringVar() Entry(self, relief=SUNKEN, textvariable=display).pack(side=TOP, expand=YES, fill=BOTH) for key in ("123", "456", "789", "-0."): keyF = frame(self, TOP) for char in key: button(keyF, LEFT, char, lambda w=display, c=char: w.set(w.get() + c)) opsF = frame(self, TOP) for char in "+-*/=": if char == '=': btn = button(opsF, LEFT, char) btn.bind('<ButtonRelease-1>', lambda e, s=self, w=display: s.calc(w), '+') else: btn = button(opsF, LEFT, char, lambda w=display, s=' %s '%char: w.set(w.get()+s)) clearF = frame(self, BOTTOM) button(clearF, LEFT, 'Clr', lambda w=display: w.set('')) def calc(self, display): try: display.set(eval(display.get())) except: display.set("ERROR") if __name__ == '__main__': Calculator().mainloop()
Отредактировано Alen (Янв. 23, 2015 12:01:03)
Офлайн
0
Оу, спасибо огромное!
То, что нужно!)
Офлайн
39
Код - жуткая лажа… В качестве примера использовать нельзя!
Офлайн
0
Код как код - главное помог с вопросом…
Офлайн
39
Pomidor
Если будете так кодить - станете говнокодером… А так ничего. Код как код 
P.S. Ну и если с вопросом помог, то тогда нормально. Но все равно так лучше не писать. Хотя идея передачи аргумента через анонимную функцию показана верно.
P.S.S. Просто этот код могут увидеть новички и будут думать, что такой код есть гуд, что в корне неверно.
Офлайн
49
4kpt_III
Код банальная копипаста с первой же ссылки выданной поисковой системой по запросу “python tk Calculator”, с двумя исправлениями для работоспособности, картинка, что характерно, тоже от туда.
Что там ужасного в упор не вижу, разве что eval, да еще exсept широковещательный, ну можно еще к названиям переменных прикопаться, типа не по PEP8.
Основная идея (мудрость, лайфкак) раскрыта в первой же строке: “Не знаешь как, вспомни где подобное применяется – и найди исходник”.
Офлайн
39
Alen
Знаете, что уважаю и не буду ругаться 
А если по коду, то все… Вообще все. От импорта до функции создания отдельной кнопки. Ну и на бинд вешать лябду, чтобы определить виджет - это вообще апофигительный апофеоз. Для этого есть event, а если быть точным, то event.widget. Который является ссылкой на объект, с которого пришло событие (я об этом писал).
P.S. Там bind - там command. Хит-парад какой-то. Вообще ужасней код еще нужно поискать. Искажено вообще все. Абсолютно. Попытка реализовать ООП вообще не понимая зачем оно в GUI нужно. За эти импорты уже бьюсь не один год… Короче. Вы меня поняли 
P.S.S. Лучше было просто привести кусок кода, а не всю эту похабщину. Но это мое личное мнение.
Отредактировано 4kpt_III (Янв. 23, 2015 19:54:46)
Офлайн
49
4kpt_III
Там bind - там command. Хит-парад какой-то.
Офлайн