Tkinter键盘敲击监听小工具
1. 用到的库
tkinter # Python自带的GUI库
pynput # 具有键盘监听和控制功能的库
threading.Timer # 用来计时,实现每天凌晨更新监听结果
2. 代码
from pynput import keyboard
from datetime import datetime, timedelta
import tkinter as tk
from threading import Timer
class MyGUI():
def __init__(self):
# 初始化GUI
self.init_gui()
# 开启键盘监听
self.start_keyboard_listen()
# 开启Timer计时器
self.set_timer()
# 记录开启时间
self.log('程序已开启!')
def init_gui(self):
# 初始化GUI窗口
self.root = tk.Tk()
# 设置窗口名称
self.root.title('键盘监听')
# 设置窗口大小和位置 长x宽+左边距+上边距
self.root.geometry('200x120+1100+20')
# 设置窗口左右不允许伸缩,左右可以伸缩
self.root.resizable(False, True)
# 设置窗口置于顶部
# self.root.wm_attributes('-topmost', 1)
# 设置敲键盘数起始数为0
self.times = 0
# 设置Lable标签文本为StringVar,以及初始化
self.times_var = tk.StringVar()
self.times_var.set(f'今日已敲击键盘{self.times}次')
# 创建一个标签lb
self.lb = tk.Label(self.root,
textvariable=self.times_var,
bg='DarkRed',
fg='Snow',
width=24,
font=('宋体', 12),
relief='ridge'
)
self.lb.pack()
# 设置一个Text文本框
self.text = tk.Text(self.root, width=30, height=100, bg='white')
self.text.pack()
self.text.configure(state='disable')
self.text_insert('程序启动!')
def now(self):
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
def log(self, record:str):
with open('record.txt', 'a') as f:
f.write(self.now()+'n')
f.write(record+'nn')
def text_insert(self, content):
self.text.configure(state='normal')
self.text.insert('insert', self.now() + 'n')
self.text.insert('insert', content+'n')
self.text.configure(state='disable')
# 初始化Timer计时器
def set_timer(self):
# 开启程序时间
now_time = datetime.now()
# 第二天同一时间
now_tom = now_time + timedelta(days=+1)
# 第二天凌晨时间
next_time = datetime.strptime(str(now_tom.year)+"-"+str(now_tom.month)+"-"+str(now_tom.day)+" 00:00:00", "%Y-%m-%d %H:%M:%S")
# 现在到明天凌晨总秒数
time_to_tomorrow = (next_time - now_time).total_seconds()
# 开启一个计时器
self.timer = Timer(time_to_tomorrow, self.timer_task)
self.timer.start()
# 计时任务, 运用了递归,最终会溢出
def timer_task(self):
# 当前时间
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 在text中写入今天的记录
self.text_insert(f'今天您一共敲击键盘{self.times}次!')
# 在txt文件中写入记录
self.log(f'今天您一共敲击键盘{self.times}次!')
# 重置敲击键盘总数
self.times = 0
self.times_var.set(f'今天您一共敲击键盘{self.times}次n')
# 开启新的计时器
self.timer = Timer(86400, self.timer_task)
self.timer.start()
# 按下键盘事件
def on_press(self, key):
# 返回False之后监听终止
if key == keyboard.Key.end:
print(f'截至目前您已敲击键盘{self.times}次!nn终止程序……')
self.shutdown()
# 松开键盘事件
def on_release(self, key):
# 每松开一次键盘,记录一次敲击
self.times += 1
self.times_var.set(f'今日已敲击键盘{self.times}次')
# 键盘监听
def start_keyboard_listen(self):
self.keys = []
self.listener = keyboard.Listener(
on_press=self.on_press,
on_release=self.on_release)
self.listener.start()
def shutdown(self):
self.log(f'程序已终止,今日已记录敲击键盘{self.times}次!')
self.timer.cancel()
print('计时器已经终止!')
self.listener.stop()
print('键盘监听已经终止!')
print('窗口已关闭')
self.root.destroy()
if __name__ == '__main__':
GUI = MyGUI()
root = GUI.root
# 删除最小化/最大化,将窗口显示成工具栏的形式
root.attributes('-toolwindow',True)
# 设置白色为透明色
root.wm_attributes('-transparentcolor','white')
# 设置窗口图标
# root.iconbitmap('键盘.ico')
# 设置关闭窗口前进行的操作
root.protocol('WM_DELETE_WINDOW', GUI.shutdown)
print('如要终止程序,请敲击"END"键……')
root.mainloop()
3. pyinstaller打包成exe文件
# -F表示生成单个可执行文件,-w表示不显示dos窗口
pyinstaller -F -i keyboard.ico -w keys.py