[Python] Why is the text placement different in 1755x1241 as compared to 900x650 in Python...

Discussão em 'Python' iniciado por Stack, Fevereiro 22, 2025.

  1. Stack

    Stack Membro Participativo

    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()

    Continue reading...

Compartilhe esta Página