Найти - Пользователи
Полная версия: bind на много фигур
Начало » GUI » bind на много фигур
1 2
vito-Z80
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 но что не пошло там с областью видимости переменных - как я понял.
vito-Z80
толи игнорят, толи я чушь тут какую-то пишу…. вроде “для новичков”

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

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

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

функции event надо для каждой фигуры отдельную делать?
FishHook
vito-Z80
толи я чушь тут какую-то пишу
Начать с того, что вы не обозначили графическую библиотеку, которой решили воспользоваться
vito-Z80
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()

понять не могу, почему событие обрабатывается только последним значением.
FishHook
vito-Z80
понять не могу, почему событие обрабатывается только последним значением.
Потому что лямбды ленивые, они замыкают контекст не в момент объявления, а в момент вызова. Когда лямбда будет вызвана, ваш цикл уже выполнится и rectNum будет равна последнему значению.
vito-Z80
FishHook
ну дак выше и с def такая-же беда, тоже event получает только последнее значение? а в class я еще не смог (((, как правильно сделать ? в каком направлении топать?
FishHook
в каком направлении топать?
Избавиться от замыканий в цикле

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()
vito-Z80
FishHook
Спасибо большое, буду разбираться, что бы это прилипить к фигурам, но с моим непониманием
__init__ self и этими классами (((

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

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

Так не пойдет. Вы не сможете писать ГУИ-приложения без ООП сложнее хелловорда. Вам сначала надо освоить объектно-ориентированное программирование, а уж потом начинать ковырять ГУИ-фреймворки. Иначе - никак.
ayb
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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB