Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 28, 2016 01:59:16

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

bind на много фигур

def focIn(event):
    print('Focus')
    canv.itemconfig(position,outline='white',width=3,fill='red')
def focOut(event):
    print('No Focus')
    canv.itemconfig(position,outline='black',width=1,fill=color)
rN=[]
for i in range(20):
    i=canv.create_rectangle(10, nextY,280,20+nextY, width=1,fill=color,outline='black')
    rN.append(i)
    nextY=nextY+30
for position in rN:
    canv.tag_bind(position,'<Enter>',focIn)
    canv.tag_bind(position,'<Leave>',focOut)

Люди добрые подскажите как фокусировать каждый прямоугольник ?

Второй цикл явно бесполезен - выдает только фокус последнего прямоугольника из 20-ти, при наведении на любой из тех 20-ти.


Понять еще не могу, циклы эти выполняются в программе всего 1 раз, почему тогда работает bind - хоть и не так как мне хотелось-бы. Или bind встречаясь в любом месте программы включается как прерывание? Если так, то как изменять position в данном случае, что бы фокус был на той фигуре на которую наведена мышь ?
Пробовал пихать bind в первый цикл отпуская второй - тоже не помогло.
Пробовал вместо второго цикла делать функцию с постоянным вызовом самой себя .after но что не пошло там с областью видимости переменных - как я понял.

Офлайн

#2 Апрель 28, 2016 06:18:49

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

bind на много фигур

толи игнорят, толи я чушь тут какую-то пишу…. вроде “для новичков”

….вот создал я N прямоугольников на холсте, как мне узнать идентификатор или тег каждого из них, что бы наведя мышь на любой прямоугольник, визуально изменился именно он, а не любой другой ?

…или есть возможность вычислить идентификатор фигуры по координатам мыши, или еще как ?
…или есть возможность создать список переменных типа

otherRect = [a1,a2,a3,a4,a5,...]
что бы я в цикле мог задать каждой переменной
otherRecr[i]=canv.create_rectangle(x,y,x,y)
, что бы вручную не делать N-ое количество фигур?

…или в гугле я не правильно спрашиваю ?

функции event надо для каждой фигуры отдельную делать?

Отредактировано vito-Z80 (Апрель 28, 2016 06:55:26)

Офлайн

#3 Апрель 28, 2016 07:20:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

bind на много фигур

vito-Z80
толи я чушь тут какую-то пишу
Начать с того, что вы не обозначили графическую библиотеку, которой решили воспользоваться



Офлайн

#4 Апрель 28, 2016 07:38:36

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

bind на много фигур

FishHook

tkinter

from tkinter import *
root = Tk()
root.geometry("400x400")
canv = Canvas(root, width=200, height=200,bg="blue", cursor="hand2")
canv.place(x=10,y=10)
toRight=15
array=[]
for rectNum in range(1,11):
    array.append('rect_'+str(rectNum))
    canv.create_rectangle(0+toRight,10,10+toRight,20, width=1,fill='#289d0a',outline='black',tag=array[rectNum-1])
    toRight+=15
for rectNum in array:
    canv.tag_bind(rectNum,'<Enter>',lambda event:canv.itemconfig(rectNum,outline='white',width=3,fill='red'))
mainloop()

понять не могу, почему событие обрабатывается только последним значением.

Отредактировано vito-Z80 (Апрель 28, 2016 07:39:19)

Офлайн

#5 Апрель 28, 2016 07:52:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

bind на много фигур

vito-Z80
понять не могу, почему событие обрабатывается только последним значением.
Потому что лямбды ленивые, они замыкают контекст не в момент объявления, а в момент вызова. Когда лямбда будет вызвана, ваш цикл уже выполнится и rectNum будет равна последнему значению.



Офлайн

#6 Апрель 28, 2016 07:57:48

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

bind на много фигур

FishHook
ну дак выше и с def такая-же беда, тоже event получает только последнее значение? а в class я еще не смог (((, как правильно сделать ? в каком направлении топать?

Отредактировано vito-Z80 (Апрель 28, 2016 08:00:21)

Офлайн

#7 Апрель 28, 2016 08:17:55

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

bind на много фигур

в каком направлении топать?
Избавиться от замыканий в цикле

from Tkinter import *
root = Tk()
root.geometry("400x400")
def command(i):
    print(i)
class MyButton(Button):
    def __init__(self, *args, **kw):
        i = kw.pop("i")
        kw["command"] = lambda: command(i)
        Button.__init__(self, *args, **kw)
for i in range(10):
    b = MyButton(root, text=i, i=i)
    b.pack()
mainloop()



Офлайн

#8 Апрель 28, 2016 08:22:45

vito-Z80
Зарегистрирован: 2015-09-10
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

bind на много фигур

FishHook
Спасибо большое, буду разбираться, что бы это прилипить к фигурам, но с моим непониманием
__init__ self и этими классами (((

…когда пробовал классы, так и не понял зачем нужен self если и без него примеры работали.

Офлайн

#9 Апрель 28, 2016 08:29:08

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

bind на много фигур

vito-Z80
Спасибо большое, буду разбираться, что бы это прилипить к фигурам, но с моим непониманием
__init__ self и этими классами (((

…когда пробовал классы, так и не понял зачем нужен self если и без него примеры работали.

Так не пойдет. Вы не сможете писать ГУИ-приложения без ООП сложнее хелловорда. Вам сначала надо освоить объектно-ориентированное программирование, а уж потом начинать ковырять ГУИ-фреймворки. Иначе - никак.



Офлайн

#10 Апрель 28, 2016 08:29:09

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

bind на много фигур

from tkinter import *
root = Tk()
root.geometry("400x400")
canv = Canvas(root, width=200, height=200,bg="blue", cursor="hand2")
canv.place(x=10,y=10)
toRight=15
array=[]
def callback(e):
    item = canv.find_closest(e.x, e.y)
    canv.itemconfig(item,outline='white',width=3,fill='red')
for rectNum in range(1,11):
    array.append('rect_'+str(rectNum))
    canv.create_rectangle(0+toRight,10,10+toRight,20, width=1,fill='#289d0a',outline='black',tag=array[rectNum-1])
    toRight+=15
for rectNum in array:
    canv.tag_bind(rectNum,'<Enter>', callback)
mainloop()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version