События виджета холста Tkitnter - PullRequest
0 голосов
/ 10 марта 2020

Я делаю ткинтер gui и хочу, чтобы он работал так: у меня есть рамка, внутри рамки есть холст, а внутри холста есть несколько прямоугольников

Я хочу сделать если я наведу курсор мыши на прямоугольник, его цвет изменится с белого на зеленый простой, верно?

так что помогите мне понять, что не так

Вот класс:

class guiSong:

    def __init__(self, master: tkinter.Canvas, songobject: SongFile, x, y, rect=None):
        self.master = master
        self.songobject = songobject
        self.x = x
        self.y = y
        self.rect = rect

    def on_enter(self, event):
        self.master.itemconfig(self.rect, fill='green')
        print("Should change to green rect ", str(self.rect))

    def on_leave(self, enter):
        self.master.itemconfig(self.rect, fill='white')

    def display(self):
        self.rect = self.master.create_rectangle(self.x, self.y, self.x + 1150, self.y + 150, fill='white', tags = ['playbutton',self.songobject])
        print("Self Rect is "+str(self.rect)+"!!!!!!!!!!!!!!!!!!!!!!!")
        self.master.tag_bind('playbutton',"<Enter>", self.on_enter)
        self.master.tag_bind('playbutton',"<Leave>", self.on_leave)
        self.albumimg = Image.open(BytesIO(self.songobject.albumimage))
        self.albumimg = ImageOps.expand(self.albumimg,border=5)
        self.albumimg = self.albumimg.resize((120, 120), Image.ANTIALIAS)
        self.img = ImageTk.PhotoImage(self.albumimg)
        make_image(self.img, self.x + 25, self.y + 15, self.master)
        print(f"Creating image {str(self.img)} at x",self.x+25, " y ",self.y+15 )
        return self.img
        #self.master.create_image(self.x + 25, self.y + 15, anchor = tkinter.W,image=img)

Не беспокойтесь обо всех вещах, связанных с песенными объектами, которые не связаны

Я составил список этих объектов и отобразил их все внутри холста один за другим. Ожидаемый результат - когда я наведу курсор на прямоугольник, зеленый цвет, что происходит в действительности, это то, что только последний созданный прямоугольник окрашивается, когда он находится над любым прямоугольником.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Поскольку каждый прямоугольник является экземпляром guiSong, вы можете напрямую привязать элемент холста, а не тег.

Вот упрощенная версия вашего класса:

class guiSong:
    def __init__(self, master, songobject, x, y):
        self.master = master
        tags = ("playbutton", songobject)
        self.rect = master.create_rectangle(x,y,x+100, y+100, tags=tags, fill="white")
        self.master.tag_bind(self.rect, "<Enter>", self.on_enter)
        self.master.tag_bind(self.rect, "<Leave>", self.on_leave)

    def on_enter(self, event):
        self.master.itemconfigure(self.rect, fill="red")

    def on_leave(self, event):
        self.master.itemconfigure(self.rect, fill="white")

Если вы хотите sh связать с тегом, вы можете использовать тег "текущий" для ссылки на объект, который получил событие.

class guiSong:
    ...
    def on_enter(self, event):
        self.master.itemconfigure("current", fill="red")

    def on_leave(self, event):
        self.master.itemconfigure("current", fill="white")
0 голосов
/ 10 марта 2020

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

Примечание: для blue цвета, Я сделал пример с аргументом в функции обратного вызова.

import tkinter as tk

class GUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.can = tk.Canvas(self, width=200, height=200)
        self.can.pack()
        self.rect = self.can.create_rectangle(50, 50, 100, 100, fill="gray")

        self.can.tag_bind(self.rect, '<Enter>', self.green_rect)       
        self.can.tag_bind(self.rect, '<Leave>', self.red_rect)       
        self.can.tag_bind(self.rect, '<Button-1>', lambda x:self.color_rect("blue"))             

    def color_rect(self, color):
        self.can.itemconfigure(self.rect, fill=color)

    def green_rect(self, event=None):
        self.can.itemconfigure(self.rect, fill="green")

    def red_rect(self, event=None):
        self.can.itemconfigure(self.rect, fill="red")

gui = GUI()
gui.mainloop()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...