Reputation: 1
I am creating a GUI application that generates certificate based on the user input. The problem arising is that the placement of placeholder text in 900x650 canvas image does not align with the placement of actual text in 1755x1241 PNG file even after calculating the coordinates based on the scale of the canvas image and the actual PNG image. The actual text appears to be shifted as compared to the placeholder text
import tkinter as tk
from PIL import Image,ImageDraw,ImageTk,ImageFont
class ImageText:
def __init__(self):
self.root = tk.Tk() #main element
self.canvas = tk.Canvas(self.root, width=900, height=650,highlightthickness=1,highlightbackground="red")
self.canvas.pack()
name_entry=tk.Entry(self.root)
regno_entry=tk.Entry(self.root)
date_entry=tk.Entry(self.root)
applybtn=tk.Button(self.root,text="Generate",command=lambda:self.generatecertificate(name_entry.get(),regno_entry.get(),date_entry.get()))
name_entry.pack()
regno_entry.pack()
date_entry.pack()
applybtn.pack()
self.image = Image.open("./blank_certificate.jpg") # Replace with your image path
self.width=900
self.height=650
self.image_resize=self.image.resize((self.width,self.height)) # resize the image
self.photo = ImageTk.PhotoImage(self.image_resize) # convert image to tkinter-compatible
self.placeholder_x=100
self.placeholder_y=100
self.placenum_x=150
self.placenum_y=150
self.placedate_x=200
self.placedate_y=200
self.placeholdertxt="{Name}"
self.placenumber="{Number}"
self.placedate="{Date}"
self.crtimg=self.canvas.create_image(0, 0, anchor=tk.NW, image=self.photo) # create image
self.nametxt=self.canvas.create_text(self.placeholder_x,self.placeholder_y,fill="red",text=self.placeholdertxt,tags="txt")
self.number=self.canvas.create_text(self.placenum_x,self.placenum_y,fill="red",text=self.placenumber,tags="txtnum")
self.date=self.canvas.create_text(self.placedate_x,self.placedate_y,fill="red",text=self.placedate,tags="txtdate")
self.canvas.tag_raise("txt")
self.canvas.tag_raise("txtnum")
self.canvas.tag_raise("txtdate")
self.canvas.bind("<Button-1>",func=self.buttonpressed)
self.canvas.bind("<B1-Motion>",func=self.buttonmove)
self.root.mainloop()
def generatecertificate(self,name,certno,date):
img=Image.open("./blank_certificate.jpg")
imgdraw=ImageDraw.Draw(img)
imgfont=ImageFont.load_default(size=75)
imgcertfont=ImageFont.load_default(size=23)
imgdatefont=ImageFont.load_default(size=20)
original_width, original_height = img.size
scale_x = self.width / original_width
scale_y = self.height / original_height
image_x = int(self.x_coord/scale_x)
image_y = int(self.y_coord/scale_y)
image_x_cert = int(self.x_certno/scale_x)
image_y_cert= int(self.y_certno/scale_y)
image_x_date = int(self.x_date / scale_x)
image_y_date= int(self.y_date / scale_y)\
imgname=imgdraw.text((image_x,image_y),name,font=imgfont,fill=(0,0,0)) # certificate name
imgcert=imgdraw.text((image_x_cert,image_y_cert),certno,font=imgcertfont,fill=(0,0,0)) # certficate number
imgdate=imgdraw.text((image_x_date,image_y_date),date,font=imgdatefont,fill=(0,0,0)) # cetificate date
img.show()
def buttonpressed(self,event):
item_id = self.canvas.find_closest(event.x, event.y)[0] # Find the closest item
tags = self.canvas.gettags(item_id) # Get the tag of the item
if("txt" in tags):
self.x_coord=event.x
self.y_coord=event.y
elif("txtnum" in tags):
self.x_certno=event.x
self.y_certno=event.y
elif("txtdate" in tags):
self.x_date=event.x
self.y_date=event.y
def buttonmove(self,event):
item_id = self.canvas.find_closest(event.x, event.y)[0] # Find the closest item
tags = self.canvas.gettags(item_id) # Get the tag of the item
print(tags)
if("txt" in tags):
self.dx=event.x-self.x_coord
self.dy=event.y-self.y_coord
self.placeholder_x+=self.dx
self.placeholder_y+=self.dy
self.x_coord=self.placeholder_x
self.y_coord=self.placeholder_y
self.canvas.move("txt", self.dx, self.dy)
elif("txtnum" in tags):
self.dxc=event.x-self.x_certno
self.dyc=event.y-self.y_certno
self.placenum_x+=self.dxc
self.placenum_y+=self.dyc
self.x_certno=self.placenum_x
self.y_certno=self.placenum_y
self.canvas.move("txtnum", self.dxc, self.dyc)
elif("txtdate" in tags):
self.dxd=event.x-self.x_date
self.dyd=event.y-self.y_date
self.placedate_x+=self.dxd
self.placedate_y+=self.dyd
self.x_date=self.placedate_x
self.y_date=self.placedate_y
self.canvas.move("txtdate", self.dxd, self.dyd)
ImageText()
Upvotes: 0
Views: 37