python pynput实现鼠标点击两坐标生成截图

脚本主要实现以下功能:

  • 按ctrl开始截图,点击两个坐标,保存截图

  • tk输出截图文本信息,文本输出内容倒序处理

  • 默认命名为A0自增。支持自定义名称,自增编号,修改自定义名称自增重新计算

  • 清空文本框内容

    from pynput import mouse, keyboard
    from PIL import ImageGrab
    import tkinter as tk

    使用字典来维护每个自定义名称的截图计数

    screenshot_counts = {}

    def start_screenshot(text_widget, name_entry):
    positions = []

    复制代码
      def on_click(x, y, button, pressed):
          if not pressed:
              # 当鼠标松开时记录位置
              positions.append((x, y))
              text_widget.insert('1.0', f'坐标为{x},{y}\n')
              # 如果已经记录了两个位置,就停止监听
              if len(positions) == 2:
                  return False
    
      # 开始监听鼠标
      with mouse.Listener(on_click=on_click) as listener:
          listener.join()
    
      if len(positions) == 2:
          # 确保截图区域的坐标是正确的
          left = min(positions[0][0], positions[1][0])
          top = min(positions[0][1], positions[1][1])
          right = max(positions[0][0], positions[1][0])
          bottom = max(positions[0][1], positions[1][1])
    
          # 使用PIL的ImageGrab模块的grab函数来截图
          screenshot = ImageGrab.grab((left, top, right, bottom))
    
          # 获取用户输入的名称
          screenshot_name = name_entry.get()
    
          # 如果用户没有输入名称,使用默认的名称"A"
          if screenshot_name == "":
              screenshot_name = "A"
          # 检查名称是否存在于字典中,如果不存在,初始化计数值
          if screenshot_name not in screenshot_counts:
              screenshot_counts[screenshot_name] = 0
          # 根据名称获取对应的计数值
          count = screenshot_counts[screenshot_name]
          screenshot_name_with_count = f"{screenshot_name}{count}.png"
    
          # 保存截图
          screenshot.save(screenshot_name_with_count)
          text_widget.insert('1.0', f'截图已保存为{screenshot_name_with_count}\n')
          text_widget.insert('1.0', f'#--------\n')
          text_widget.insert('1.0', f'\n')
    
          # 增加对应名称的截图计数
          screenshot_counts[screenshot_name] += 1

    def on_release(key, text_widget, name_entry):
    if key == keyboard.Key.esc:
    # 当按下esc键时停止监听
    return False
    elif key == keyboard.Key.ctrl_l:
    # 当按下ctrl键时开始截图
    text_widget.insert('1.0', '开始截图\n')
    start_screenshot(text_widget, name_entry)

    def clear_text(text_widget):
    text_widget.delete(1.0, tk.END)

    创建tkinter窗口

    root = tk.Tk()
    root.geometry('145x180')
    text_widget = tk.Text(root, height=10, width=20)
    text_widget.pack()
    name_entry = tk.Entry(root)
    name_entry.pack()
    clear_button = tk.Button(root, text="清空文本框", command=lambda: clear_text(text_widget))
    clear_button.pack()

    开始监听键盘

    with keyboard.Listener(on_release=lambda key: on_release(key, text_widget, name_entry)) as listener:
    root.mainloop()

如有帮助,请多多支持作者! 你鼓励是我最大的动力~QAQ~

相关推荐
呵呵哒( ̄▽ ̄)"10 分钟前
线性代数:同解(1)
python·线性代数·机器学习
SweetCode15 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
CryptoPP28 分钟前
springboot 对接马来西亚数据源API等多个国家的数据源
spring boot·后端·python·金融·区块链
xcLeigh36 分钟前
OpenCV从零开始:30天掌握图像处理基础
图像处理·人工智能·python·opencv
大乔乔布斯36 分钟前
AttributeError: module ‘smtplib‘ has no attribute ‘SMTP_SSL‘ 解决方法
python·bash·ssl
明灯L1 小时前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
databook1 小时前
不平衡样本数据的救星:数据再分配策略
python·机器学习·scikit-learn
碳基学AI1 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
niuniu_6661 小时前
简单的自动化场景(以 Chrome 浏览器 为例)
运维·chrome·python·selenium·测试工具·自动化·安全性测试
FearlessBlot1 小时前
Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified
python·flask