Это работает для одной кнопки.
Можно как-нибудь сократить текст?
Грубые ошибки наблюдаются?
from tkinter import *
from PIL import Image, ImageTk
class Scr:
def __init__(self, root, w, h):
self.scrw=w
self.scrh=h
self.cnv=Canvas(root, width=w-1, height=h-1, bg="blue")
self.cnv.bind("<ButtonPress-1>", self.LBPress)
self.cnv.bind("<ButtonRelease-1>", self.LBRelease)
self.cnv.pack()
self.ifonu=Image.open("fon.png") # Изображение с отжатыми кнопками
self.ifond=Image.open("fon.png") # Изображение с нажатыми кнопками
self.ifon=Image.open("fon.png") # Изображение для отображения на экране
self.p=ImageTk.PhotoImage(self.ifon)
self.i=self.cnv.create_image(0, 0, image=self.p)
# Добавить кнопку
def addbt(self, x, y, file_up, file_down):
self.bx=x # Left
self.by=y # Top
self.bw=220 # Width
self.bh=95 # Height
self.ibtu=Image.open(file_up) # Полупрозрачная отжатая кнопка
self.ibtd=Image.open(file_down) # Полупрозрачная нажатая кнопка
self.ifonu.paste(self.ibtu, (x,y), self.ibtu) # Наносим кнопку отжатую
self.ifond.paste(self.ibtd, (x,y), self.ibtd) # Наносим нажатую
self.btu=self.ifonu.crop((x,y,x+self.bw,y+self.bh)) # Вырезаем полупрозрачную кнопку с фоном
self.btd=self.ifond.crop((x,y,x+self.bw,y+self.bh)) # Вырезаем полупрозрачную кнопку с фоном
self.ifon.paste(self.btu, (x,y)) # Отображаем текущее состояние на изображении для отображения
self.pp=ImageTk.PhotoImage(self.ifon)
self.cnv.itemconfigure(self.i, image=self.pp, anchor="nw")
# На канвасе обновляем изображение кнопка нажата
def LBPress(self, event):
if self.bx<event.x<self.bx+self.bw and self.by<event.y<self.by+self.bh:
self.ifon.paste(self.btd, (self.bx,self.by))
self.pp=ImageTk.PhotoImage(self.ifon)
self.cnv.itemconfigure(self.i, image=self.pp, anchor="nw")
# На канвасе обновляем изображение кнопка отжата
def LBRelease(self, event):
if self.bx<event.x<self.bx+self.bw and self.by<event.y<self.by+self.bh:
self.ifon.paste(self.btu, (self.bx,self.by))
self.pp=ImageTk.PhotoImage(self.ifon)
self.cnv.itemconfigure(self.i, image=self.pp, anchor="nw")
w=1024
h=768
root = Tk()
root.geometry(str(w)+"x"+str(h)+"+0+0")
root.overrideredirect(1)
s = Scr(root, w, h)
s.addbt(200, 500, "bt_up.png", "bt_down.png")
root.mainloop()