Python Tkinter 和 Pillow - 添加时文本会发生偏移

Python Tkinter and Pillow - Text gets offset when added

所以我有这个文本加法器,它应该找到矩形的中心并在那里添加文本。但我注意到它偏离了它应该是的样子(https://imgur.com/a/5aGcpPw)

我已经尝试检查我的代码,但我仍然无法弄清楚。图像缩小到 4 倍大小以适合屏幕,但之后坐标都乘以 4 以说明这一点。帮忙?

完整代码(失败的部分如下):https://pastebin.com/JzApRJdM

class PictureWindow(tk.Toplevel):
    def __init__(self, parent):
        tk.Toplevel.__init__(self, parent)
        self.parent = parent
        self.x = self.y = 0
        self.rect = None
        self.tex = None
        self.start_x = None
        self.start_y = None

        image = Image.open(file)
        smaller_image = image.resize((round(image.size[0]/4), round(image.size[1]/4)))

        img = ImageTk.PhotoImage(smaller_image)
        self.canvas = tk.Canvas(self, width=img.width(), height=img.height())

        self.canvas.img = img 
        self.canvas.create_image(0, 0, image=img, anchor=tk.NW)
        self.canvas.pack(expand=True)

        self.canvas.bind("<ButtonPress-1>", self.on_button_press)
        self.canvas.bind("<B1-Motion>", self.on_move_press)
        self.canvas.bind("<ButtonRelease-1>", self.on_button_release)

        self.finished = tk.Button(self, text="Add Watermark", command=self.Watermark)
        self.finished.pack()
        self.go_back = tk.Button(self, text="Go back to change settings", command=self.go_away)
        self.go_back.pack()

    def _from_rgb(self, rgb):
        r, g, b = rgb
        return f'#{r:02x}{g:02x}{b:02x}'

    def go_away(self):
        self.withdraw()

    def on_button_press(self, event):
        self.start_x = event.x
        self.start_y = event.y

        self.canvas.delete(self.tex)
        self.tex = None 

        if not self.rect:
            self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, fill=self._from_rgb((249, 0, 0)), stipple='gray12')

    def on_move_press(self, event):
        self.curX, self.curY = (event.x, event.y)
        self.text_x = ((self.start_x + self.curX) / 2) 
        self.text_y = ((self.start_y + self.curY) / 2) 

        self.canvas.coords(self.rect, self.start_x, self.start_y, self.curX, self.curY)

    def on_button_release(self, event):
        font_preview_size = int(font_size)
        font_preview_almost = (font_preview_size/4)
        font_preview = int(font_preview_almost)

        if not self.tex:
            self.tex = self.canvas.create_text((self.text_x, self.text_y), text=watermark_text, font=('Gotham Medium', font_preview), fill=self._from_rgb((color)))

    def Watermark(self):
        self.font_size_var = font_size
        Font_Size = int(self.font_size_var)

        A = int(alpha)

        R = int(color[0])
        B = int(color[1])
        G = int(color[2])

        img = Image.open(file).convert("RGBA")

        img.x, img.y = img.size 
        txt = Image.new("RGBA", img.size, (225,225,225,0))

        if custom_font == "yes":
            font = ImageFont.truetype(font_file, Font_Size)
            draw = ImageDraw.Draw(txt)
            text = watermark_text

        if custom_font == "no": 
            font = ImageFont.truetype('arial.ttf', Font_Size)
            draw = ImageDraw.Draw(txt)
            text = watermark_text

        print(f'Start X and Y: {self.start_x}, {self.start_y}')
        print(f'Current X and Y: {self.curX}, {self.curY}')
        print(f'Canvas: {self.canvas.winfo_screenwidth()}, {self.canvas.winfo_screenheight()}')

        self.coords = ((self.start_x + self.curX) / 2)*4, ((self.start_y + self.curY) / 2)*4

        print(f'Final Coords: {self.coords}')

        draw.text((self.coords), text, font=font, fill=(R, G, B, A))

        comp = Image.alpha_composite(img, txt)

        comp.save(save_file)
        comp.show()


app = Selection(root)
app.mainloop()

我认为是因为字体大小保持不变。

愚蠢的是,我不知道有助于解决此问题的锚点功能。我只需要使用 anchor 并将其设置为 mm