自学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()
|