实现截图和贴图以及简单绘图的基本功能

This commit is contained in:
awin-x 2025-01-15 20:19:00 +08:00
parent 8e58179538
commit 67b54ce2b6

View File

@ -9,6 +9,7 @@ import threading
class PinPicture(tk.Frame): class PinPicture(tk.Frame):
def __init__(self, image, master=None): def __init__(self, image, master=None):
super().__init__(master) super().__init__(master)
self.pinBtn = None
self.lineBtn = None self.lineBtn = None
self.arrowBtn = None self.arrowBtn = None
self.rectBtn = None self.rectBtn = None
@ -51,6 +52,7 @@ class PinPicture(tk.Frame):
self.rectBtn = tk.Button(text='矩形', command=self.set_rect) self.rectBtn = tk.Button(text='矩形', command=self.set_rect)
self.arrowBtn = tk.Button(text='箭头', command=self.set_arrow) self.arrowBtn = tk.Button(text='箭头', command=self.set_arrow)
self.lineBtn = tk.Button(text='直线', command=self.set_line) self.lineBtn = tk.Button(text='直线', command=self.set_line)
self.pinBtn = tk.Button(text='确定', command=self.pin_mode_event)
self.master.bind("<Escape>", self.close) self.master.bind("<Escape>", self.close)
self.master.bind("<Enter>", self.enter_canvas) self.master.bind("<Enter>", self.enter_canvas)
@ -99,6 +101,13 @@ class PinPicture(tk.Frame):
self.canvas.bind("<ButtonPress-1>", self.on_drag_start) self.canvas.bind("<ButtonPress-1>", self.on_drag_start)
self.canvas.bind("<B1-Motion>", self.on_drag) self.canvas.bind("<B1-Motion>", self.on_drag)
self.canvas.bind("<MouseWheel>", self.on_mouse_wheel) self.canvas.bind("<MouseWheel>", self.on_mouse_wheel)
if self.drawMode:
self.drawMode = False
self.pinBtn.pack_forget()
self.lineBtn.pack_forget()
self.arrowBtn.pack_forget()
self.penBtn.pack_forget()
self.rectBtn.pack_forget()
# 鼠标进入 # 鼠标进入
def enter_canvas(self, event): def enter_canvas(self, event):
@ -123,6 +132,7 @@ class PinPicture(tk.Frame):
self.rectBtn.pack() self.rectBtn.pack()
self.arrowBtn.pack() self.arrowBtn.pack()
self.lineBtn.pack() self.lineBtn.pack()
self.pinBtn.pack()
def set_pen(self): def set_pen(self):
self.canvas.bind("<B1-Motion>", self.pen) self.canvas.bind("<B1-Motion>", self.pen)
@ -148,7 +158,7 @@ class PinPicture(tk.Frame):
self.start_draw(event) self.start_draw(event)
self.pad = Image.new('RGBA', self.image.size, color=(0, 0, 0, 100)) self.pad = Image.new('RGBA', self.image.size, color=(0, 0, 0, 100))
self.drawPad = ImageDraw.Draw(self.pad) self.drawPad = ImageDraw.Draw(self.pad)
self.drawPad.rectangle((self.penX, self.penY, event.x, event.y), fill=(0,0,0,0), outline="purple") self.drawPad.rectangle((self.penX, self.penY, event.x, event.y), fill=(0, 0, 0, 0), outline="purple")
self.update_canvas_cut() self.update_canvas_cut()
self.cutX = event.x self.cutX = event.x
self.cutY = event.y self.cutY = event.y
@ -163,6 +173,7 @@ class PinPicture(tk.Frame):
self.drawPad = ImageDraw.Draw(self.pad) self.drawPad = ImageDraw.Draw(self.pad)
self.penX = event.x self.penX = event.x
self.penY = event.y self.penY = event.y
# 关闭窗口 # 关闭窗口
def close(self, event): def close(self, event):
self.master.destroy() self.master.destroy()
@ -247,10 +258,9 @@ class PinPicture(tk.Frame):
y1 = pos[1] y1 = pos[1]
x2 = pos[2] x2 = pos[2]
y2 = pos[3] y2 = pos[3]
l = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) l = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) + 1
cosa = (x2 - x1) / l cosa = (x2 - x1) / l
sina = (y2 - y1) / l sina = (y2 - y1) / l
k = sina / cosa
d = self.arrowSize * (sina + cosa) d = self.arrowSize * (sina + cosa)
if (sina < cosa): if (sina < cosa):
xa = x2 - d xa = x2 - d
@ -280,4 +290,4 @@ class PinPicture(tk.Frame):
if self.drawMode: if self.drawMode:
self.image = Image.alpha_composite(self.image, self.pad) self.image = Image.alpha_composite(self.image, self.pad)
self.pad = Image.new('RGBA', self.image.size) self.pad = Image.new('RGBA', self.image.size)
self.drawPad = ImageDraw.Draw(self.pad) self.drawPad = ImageDraw.Draw(self.pad)