Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 23, 2015 11:26:59

Pomidor
Зарегистрирован: 2015-01-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

День добрый. Подскажите пожалуйста, как решить проблему:
есть массив кнопок в Tkinter (100500 штук), по одной из них кликнули, но не могу узнать, по какой. Подскажите, как получить хоть какую информацию о ней? В идеале - индекс в массиве.
Заранее спасибо)

Офлайн

#2 Янв. 23, 2015 11:33:13

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

давайте код



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Янв. 23, 2015 11:35:59

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

Берем стандартное многокнопочное приложение (калькулятор) и смотрим.



#!/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)

Офлайн

#4 Янв. 23, 2015 11:55:00

Pomidor
Зарегистрирован: 2015-01-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

Оу, спасибо огромное!
То, что нужно!)

Офлайн

#5 Янв. 23, 2015 12:50:41

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

Код - жуткая лажа… В качестве примера использовать нельзя!

Офлайн

#6 Янв. 23, 2015 18:15:24

Pomidor
Зарегистрирован: 2015-01-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

Код как код - главное помог с вопросом…

Офлайн

#7 Янв. 23, 2015 18:36:26

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

Pomidor
Если будете так кодить - станете говнокодером… А так ничего. Код как код

P.S. Ну и если с вопросом помог, то тогда нормально. Но все равно так лучше не писать. Хотя идея передачи аргумента через анонимную функцию показана верно.

P.S.S. Просто этот код могут увидеть новички и будут думать, что такой код есть гуд, что в корне неверно.

Офлайн

#8 Янв. 23, 2015 19:17:05

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

4kpt_III

Код банальная копипаста с первой же ссылки выданной поисковой системой по запросу “python tk Calculator”, с двумя исправлениями для работоспособности, картинка, что характерно, тоже от туда.

Что там ужасного в упор не вижу, разве что eval, да еще exсept широковещательный, ну можно еще к названиям переменных прикопаться, типа не по PEP8.

Основная идея (мудрость, лайфкак) раскрыта в первой же строке: “Не знаешь как, вспомни где подобное применяется – и найди исходник”.

Офлайн

#9 Янв. 23, 2015 19:54:05

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

Alen
Знаете, что уважаю и не буду ругаться
А если по коду, то все… Вообще все. От импорта до функции создания отдельной кнопки. Ну и на бинд вешать лябду, чтобы определить виджет - это вообще апофигительный апофеоз. Для этого есть event, а если быть точным, то event.widget. Который является ссылкой на объект, с которого пришло событие (я об этом писал).

P.S. Там bind - там command. Хит-парад какой-то. Вообще ужасней код еще нужно поискать. Искажено вообще все. Абсолютно. Попытка реализовать ООП вообще не понимая зачем оно в GUI нужно. За эти импорты уже бьюсь не один год… Короче. Вы меня поняли

P.S.S. Лучше было просто привести кусок кода, а не всю эту похабщину. Но это мое личное мнение.

Отредактировано 4kpt_III (Янв. 23, 2015 19:54:46)

Офлайн

#10 Янв. 23, 2015 20:02:46

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Поиск элемента по массиву Tk

4kpt_III
Там bind - там command. Хит-парад какой-то.

Чего вы хотите, код с форума по Java.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version