0
点赞
收藏
分享

微信扫一扫

自定义截屏,pynput监听键盘和鼠标

googlefrank 2022-02-02 阅读 80
python

自学python的我最近想写一个能自定义的截屏程序,于是就有了下面的。主要是用来pynput库,用这个来监听键盘真是太简单了。

代码可能存在bug,结构不是最优的,欢迎大家指出。

# @IDE                :PyCharm
# @Author             :强哥
# @Date               :2022/2/2 14:50
import pynput
import pyautogui
import time
import tkinter as tk
import threading
from tkinter import messagebox
import winsound


def thread_it(func, *args):
    t = threading.Thread(target=func, args=args)
    # 守护线程
    t.setDaemon(True)
    # 启动线程
    t.start()


def func():
    #监听鼠标
    with pynput.mouse.Listener(on_click=on_click) as df1:
        df1.join()


def on_press(key):
    global l
    #显示键盘按下按键
    # print(str(key))
    
    if str(key) == r"'\x11'":#组合键CTRL+Q
        #添加在屏幕最上层蒙版
        l = tk.Toplevel(root, width=1920, height=1080)#屏幕大小1920x1080
        #消除窗口的最上端
        l.overrideredirect(True)
        #使窗口的颜色接近透明,0.01是我随便试的
        l.attributes('-alpha', 0.01)
        #进入截屏函数
        func()
        #若返回False,就会跳出函数hh()中的df.join()
        return False


def outt():
    exit()


def on_click(x, y, button, pressed):
    global h, x0, y0, x1, y1
    if h == 0:#鼠标左键按下
        #鼠标的坐标
        x0, y0 = x, y
        h = 1
    elif h == 1:#鼠标左键抬起
        x1, y1 = x, y
        #截图
        img = pyautogui.screenshot(region=[x0, y0, x1 - x0, y1 - y0])  # x,y,w,h
        #获取截图的时间
        n_time = time.strftime("%Y-%m-%d %H:%m:%S", time.localtime()).replace(' ', '_').replace(':', '')
        img.save("D:\桌面\{}截屏.jpg".format(n_time))
        #保存好后提示
        winsound.Beep(freq, duration)
        # print("截好屏了")
        #坐标初始化
        x0 = 0
        y0 = 0
        x1 = 0
        y1 = 0
        h = 0
        #False跳出func函数中的df1.join()
        return False


def ma():
    #删除组件fr
    fr.destroy()
    #窗口最小化
    root.iconify()
    #窗口置顶
    root.wm_attributes('-topmost', 1)
    bt1 = tk.Button(root, text="退出", command=outt, font="黑体", width=10)
    bt1.pack()
    hh()


def hh():
    #开始监听键盘,转到函数on_press()
    with pynput.keyboard.Listener(on_press=on_press) as df:
        df.join()
    #删除蒙版
    l.destroy()
    hh()


if __name__ == '__main__':
    duration = 300  # 毫秒
    freq = 300  # Hz
    #弹窗提示
    root1 = tk.Tk()
    root1.withdraw()
    messagebox.showinfo("注意", "截图的快捷键是CTRL+Q,截图保存在桌面。")

    h = 0
    #截图坐标的初始化
    x0 = 0
    y0 = 0
    x1 = 0
    y1 = 0
    
    #创建交互窗口
    root = tk.Tk()
    root.geometry('80x30+0+0')
    root.title('截屏')
    fr = tk.Frame(root)
    fr.pack()
    bt = tk.Button(fr, text="开始", bg='red', command=lambda: thread_it(ma), font="黑体", width=10)
    bt.pack()
    # root.wm_attributes('-topmost', 1)
    #窗口大小不可改变
    root.resizable(0, 0)
    root.mainloop()
举报

相关推荐

0 条评论