【Python】tkinter实现snipaste截图显示功能

说明本文采用

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KmBase

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值