说明本文采用
snipaste是一款优秀的截图工具,本文参考snipaste使用tkinter实现图片显示,显示的图片可以拖拽,等比缩放~
TK实现自定无边框边缘鼠标操作
import tkinter as tk
import win32api
import win32con
from PIL import ImageTk, Image
class MyApplication:
def __init__(self):
self.root = tk.Tk()
self.root.overrideredirect(True)
image_file = 'example.png'
self.img = ImageTk.PhotoImage(Image.open(image_file))
print(self.img.width, self.img.height)
self.canvas = tk.Canvas(self.root, width=self.img.width(), height=self.img.height(), borderwidth=1,
relief='solid')
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
self.canvas.pack(fill=tk.BOTH, expand=True)
self.image_item = self.canvas.create_image(0, 0, image=self.img, anchor='nw')
self.canvas.bind('<Motion>', self.on_mouse_motion)
def on_mouse_motion(self, event):
x = self.canvas.canvasx(event.x)
y = self.canvas.canvasy(event.y)
bbox = self.canvas.bbox(self.image_item)
x1, y1, x2, y2 = bbox
print(x, y)
print('x1:', x1, 'y1:', y1, 'x2:', x2, 'y2:', y2)
m_area = 5
if x2 - m_area < x < x2 + m_area:
# 鼠标位于bbox左侧2单位以类
if y1 + m_area <= y <= y2 - m_area:
# 鼠标位于bbox左侧,上下之间
print("左右箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZEWE))
elif y2 - m_area < y < y2 + m_area:
print("左上右下箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZENWSE))
elif y1 - m_area < y < y1 + m_area:
print("左下右上箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZENESW))
else:
print("无操作")
elif x1 - m_area < x < x1 + m_area:
# 鼠标位于bbox右侧2单位以类
if y1 + m_area <= y <= y2 - m_area:
# 鼠标位于bbox左侧,上下之间
print("左右箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZEWE))
elif y2 - m_area < y < y2 + m_area:
print("左下右上箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZENESW))
elif y1 - m_area < y < y1 + m_area:
print("左上右下箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZENWSE))
else:
print("无操作")
elif x1 + m_area <= x <= x2 - m_area:
# 鼠标位于bbox中间
if y1 + m_area < y < y2 - m_area:
# 鼠标位于bbox左侧,上下之间
print("拖拽箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_ARROW))
elif y2 - m_area <= y <= y2 + m_area or y1 - m_area <= y <= y1 + m_area:
print("上下箭头")
win32api.SetCursor(win32api.LoadCursor(0, win32con.IDC_SIZENS))
else:
print("无操作")
else:
# 鼠标位于界外
print("无操作")
def run(self):
self.root.mainloop()
if __name__ == '__main__':
app = MyApplication()
app.run()
Tk实现窗口拖拽
import tkinter as tk
class DragWindow:
def __init__(self):
self.root = tk.Tk()
# 设置隐藏窗口标题栏和任务栏图标
self.root.overrideredirect(True)
# 窗口透明度60%
self.root.attributes("-alpha", 0.8)
self.x, self.y = 0, 0
self.window_size = [300, 200]
self.canvas = tk.Canvas(self.root, width=self.window_size[0], height=self.window_size[1])
self.canvas.pack(fill=tk.BOTH, expand=True)
# 绑定鼠标左键拖拽事件
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.move)
def on_button_press(self, event):
"""鼠标左键按下事件"""
self