user23369511
user23369511

Reputation: 1

Why is the text placement different in 1755x1241 as compared to 900x650 in Python Canvas?

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

Answers (0)

Related Questions