Форум сайта python.su
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)
Офлайн
толи игнорят, толи я чушь тут какую-то пишу…. вроде “для новичков”
….вот создал я N прямоугольников на холсте, как мне узнать идентификатор или тег каждого из них, что бы наведя мышь на любой прямоугольник, визуально изменился именно он, а не любой другой ?
…или есть возможность вычислить идентификатор фигуры по координатам мыши, или еще как ?
…или есть возможность создать список переменных типа
otherRect = [a1,a2,a3,a4,a5,...]
otherRecr[i]=canv.create_rectangle(x,y,x,y)
Отредактировано vito-Z80 (Апрель 28, 2016 06:55:26)
Офлайн
vito-Z80Начать с того, что вы не обозначили графическую библиотеку, которой решили воспользоваться
толи я чушь тут какую-то пишу
Офлайн
FishHook
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)
Офлайн
vito-Z80Потому что лямбды ленивые, они замыкают контекст не в момент объявления, а в момент вызова. Когда лямбда будет вызвана, ваш цикл уже выполнится и rectNum будет равна последнему значению.
понять не могу, почему событие обрабатывается только последним значением.
Офлайн
FishHookну дак выше и с def такая-же беда, тоже event получает только последнее значение? а в class я еще не смог (((, как правильно сделать ? в каком направлении топать?
Отредактировано vito-Z80 (Апрель 28, 2016 08:00:21)
Офлайн
в каком направлении топать?Избавиться от замыканий в цикле
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()
Офлайн
FishHookСпасибо большое, буду разбираться, что бы это прилипить к фигурам, но с моим непониманием
Офлайн
vito-Z80
Спасибо большое, буду разбираться, что бы это прилипить к фигурам, но с моим непониманием
__init__ self и этими классами (((
…когда пробовал классы, так и не понял зачем нужен self если и без него примеры работали.
Офлайн
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()
Офлайн