今天上班的时候突发奇想,想看一下自己上一天班到底点了多少次鼠标和键盘来统计一下。然后去各大的软件下载站去下载这类型的软件,太老了有的都打不开然后自己就直接用ai来写了一个,大概几分钟时间就做好了,大家可以看一下这个演示效果,实时统计的还是可以,并且还可以导出自己的数据发朋友装B。成品EXE软件在文章最下方大家可以下载来用下(压缩包解压密码为:ygz.ink)。演示效果如下:
代码成品如下:
import tkinter as tk from tkinter import ttk, filedialog from pynput import keyboard, mouse from datetime import datetime, timedelta import json from threading import Thread # 初始化计数器 keyboard_count = 0 mouse_click_count = 0 # 初始化时间统计数据 daily_counts = {} weekly_counts = {} monthly_counts = {} # 初始化当前日期 current_date = datetime.now().date() # 加载之前的统计数据 def load_counts(): global daily_counts, weekly_counts, monthly_counts try: with open('usage_counts.json', 'r') as f: counts = json.load(f) daily_counts = counts.get('daily_counts', {}) weekly_counts = counts.get('weekly_counts', {}) monthly_counts = counts.get('monthly_counts', {}) except FileNotFoundError: pass # 保存统计数据 def save_counts(): counts = { 'daily_counts': daily_counts, 'weekly_counts': weekly_counts, 'monthly_counts': monthly_counts } with open('usage_counts.json', 'w') as f: json.dump(counts, f) # 更新统计数据 def update_counts(): global current_date, keyboard_count, mouse_click_count date_key = str(current_date) # 检查日期是否已更改,如果是,则重置当天的计数 if date_key not in daily_counts: daily_counts[date_key] = {'keyboard': 0, 'mouse': 0} # 每天的统计数据 daily_counts[date_key]['keyboard'] += keyboard_count daily_counts[date_key]['mouse'] += mouse_click_count # 每周的统计数据 start_of_week = current_date - timedelta(days=current_date.weekday()) week_key = str(start_of_week) if week_key not in weekly_counts: weekly_counts[week_key] = {'keyboard': 0, 'mouse': 0} weekly_counts[week_key]['keyboard'] += keyboard_count weekly_counts[week_key]['mouse'] += mouse_click_count # 每月的统计数据 start_of_month = current_date.replace(day=1) month_key = str(start_of_month) if month_key not in monthly_counts: monthly_counts[month_key] = {'keyboard': 0, 'mouse': 0} monthly_counts[month_key]['keyboard'] += keyboard_count monthly_counts[month_key]['mouse'] += mouse_click_count # 重置计数器 keyboard_count = 0 mouse_click_count = 0 # 保存统计数据 save_counts() # 更新UI update_ui() # 监听键盘事件 def on_press(key): global keyboard_count keyboard_count += 1 update_counts() # 监听鼠标点击事件 def on_click(x, y, button, pressed): if pressed: global mouse_click_count mouse_click_count += 1 update_counts() # 清空统计数据 def clear_counts(): global daily_counts, weekly_counts, monthly_counts, keyboard_count, mouse_click_count daily_counts = {} weekly_counts = {} monthly_counts = {} keyboard_count = 0 mouse_click_count = 0 save_counts() update_ui() # 刷新统计数据 def refresh_counts(): load_counts() update_ui() # 更新UI界面 def update_ui(): today = str(datetime.now().date()) this_week = str(datetime.now().date() - timedelta(days=datetime.now().date().weekday())) this_month = str(datetime.now().date().replace(day=1)) keyboard_daily_label.config(text=f"今天键盘使用次数: {daily_counts.get(today, {}).get('keyboard', 0)}") mouse_daily_label.config(text=f"今天鼠标点击次数: {daily_counts.get(today, {}).get('mouse', 0)}") keyboard_weekly_label.config(text=f"本周键盘使用次数: {weekly_counts.get(this_week, {}).get('keyboard', 0)}") mouse_weekly_label.config(text=f"本周鼠标点击次数: {weekly_counts.get(this_week, {}).get('mouse', 0)}") keyboard_monthly_label.config(text=f"本月键盘使用次数: {monthly_counts.get(this_month, {}).get('keyboard', 0)}") mouse_monthly_label.config(text=f"本月鼠标点击次数: {monthly_counts.get(this_month, {}).get('mouse', 0)}") # 导出统计数据 def export_data(): export_type = export_combo.get() if export_type == '今日': data_to_export = daily_counts.get(str(current_date), {}) elif export_type == '本周': start_of_week = current_date - timedelta(days=current_date.weekday()) data_to_export = weekly_counts.get(str(start_of_week), {}) elif export_type == '本月': start_of_month = current_date.replace(day=1) data_to_export = monthly_counts.get(str(start_of_month), {}) else: return file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")]) if file_path: with open(file_path, 'w') as f: f.write(f"键盘使用次数: {data_to_export.get('keyboard', 0)}\n") f.write(f"鼠标点击次数: {data_to_export.get('mouse', 0)}\n") # 启动键盘和鼠标监听 def start_listener(): listener_kb = keyboard.Listener(on_press=on_press) listener_kb.start() listener_ms = mouse.Listener(on_click=on_click) listener_ms.start() # 创建主窗口 root = tk.Tk() root.title("键盘和鼠标使用次数统计") # 使用grid布局管理器来实现自适应 root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) # 创建统计标签 keyboard_daily_label = ttk.Label(root, text="今天键盘使用次数: 0") keyboard_daily_label.grid(row=0, column=0, padx=10, pady=10, sticky="nsew") mouse_daily_label = ttk.Label(root, text="今天鼠标点击次数: 0") mouse_daily_label.grid(row=1, column=0, padx=10, pady=10, sticky="nsew") keyboard_weekly_label = ttk.Label(root, text="本周键盘使用次数: 0") keyboard_weekly_label.grid(row=2, column=0, padx=10, pady=10, sticky="nsew") mouse_weekly_label = ttk.Label(root, text="本周鼠标点击次数: 0") mouse_weekly_label.grid(row=3, column=0, padx=10, pady=10, sticky="nsew") keyboard_monthly_label = ttk.Label(root, text="本月键盘使用次数: 0") keyboard_monthly_label.grid(row=4, column=0, padx=10, pady=10, sticky="nsew") mouse_monthly_label = ttk.Label(root, text="本月鼠标点击次数: 0") mouse_monthly_label.grid(row=5, column=0, padx=10, pady=10, sticky="nsew") # 创建清空按钮 clear_button = ttk.Button(root, text="清空统计数据", command=clear_counts) clear_button.grid(row=6, column=0, padx=10, pady=10, sticky="nsew") # 创建刷新按钮 refresh_button = ttk.Button(root, text="刷新统计数据", command=refresh_counts) refresh_button.grid(row=7, column=0, padx=10, pady=10, sticky="nsew") # 创建导出按钮 export_button = ttk.Button(root, text="导出统计数据", command=export_data) export_button.grid(row=8, column=0, padx=10, pady=10, sticky="nsew") # 创建导出选择框 export_combo = ttk.Combobox(root, values=['今日', '本周', '本月']) export_combo.set('今日') export_combo.grid(row=9, column=0, padx=10, pady=10, sticky="nsew") # 加载统计数据 load_counts() # 启动监听线程 listener_thread = Thread(target=start_listener, daemon=True) listener_thread.start() # 启动定时更新UI的线程 root.after(1000, update_ui) # 每秒更新一次UI root.mainloop()
python注释代码语句如下:
import tkinter as tk # 导入tkinter库,用于创建GUI界面 from tkinter import ttk, filedialog # 导入ttk库,用于创建更现代的GUI组件;导入filedialog库,用于文件保存对话框 from pynput import keyboard, mouse # 导入pynput库,用于监听键盘和鼠标事件 from datetime import datetime, timedelta # 导入datetime和timedelta,用于日期和时间操作 import json # 导入json库,用于处理JSON格式的数据 from threading import Thread # 导入Thread类,用于创建多线程 # 初始化计数器 keyboard_count = 0 # 初始化键盘计数器为0 mouse_click_count = 0 # 初始化鼠标计数器为0 # 初始化时间统计数据 daily_counts = {} # 初始化每天的统计数据为空字典 weekly_counts = {} # 初始化每周的统计数据为空字典 monthly_counts = {} # 初始化每月的统计数据为空字典 # 初始化当前日期 current_date = datetime.now().date() # 获取当前日期并初始化为current_date # 加载之前的统计数据 def load_counts(): global daily_counts, weekly_counts, monthly_counts # 声明使用全局变量 try: with open('usage_counts.json', 'r') as f: # 尝试打开usage_counts.json文件 counts = json.load(f) # 加载JSON数据 daily_counts = counts.get('daily_counts', {}) # 获取daily_counts数据,如果不存在则赋值为空字典 weekly_counts = counts.get('weekly_counts', {}) # 获取weekly_counts数据,如果不存在则赋值为空字典 monthly_counts = counts.get('monthly_counts', {}) # 获取monthly_counts数据,如果不存在则赋值为空字典 except FileNotFoundError: pass # 如果文件不存在,捕获异常并忽略 # 保存统计数据 def save_counts(): counts = { 'daily_counts': daily_counts, # 将daily_counts数据放入counts字典 'weekly_counts': weekly_counts, # 将weekly_counts数据放入counts字典 'monthly_counts': monthly_counts # 将monthly_counts数据放入counts字典 } with open('usage_counts.json', 'w') as f: # 打开usage_counts.json文件,以写入模式 json.dump(counts, f) # 将counts字典保存为JSON格式 # 更新统计数据 def update_counts(): global current_date, keyboard_count, mouse_click_count # 声明使用全局变量 date_key = str(current_date) # 将当前日期转换为字符串形式 # 检查日期是否已更改,如果是,则重置当天的计数 if date_key not in daily_counts: # 如果当前日期不在daily_counts中 daily_counts[date_key] = {'keyboard': 0, 'mouse': 0} # 初始化当天的数据为{'keyboard': 0, 'mouse': 0} # 每天的统计数据 daily_counts[date_key]['keyboard'] += keyboard_count # 当天键盘计数加上当前的键盘计数 daily_counts[date_key]['mouse'] += mouse_click_count # 当天鼠标计数加上当前的鼠标计数 # 每周的统计数据 start_of_week = current_date - timedelta(days=current_date.weekday()) # 计算本周的开始日期 week_key = str(start_of_week) # 将开始日期转换为字符串形式 if week_key not in weekly_counts: # 如果开始日期不在weekly_counts中 weekly_counts[week_key] = {'keyboard': 0, 'mouse': 0} # 初始化当周的数据为{'keyboard': 0, 'mouse': 0} weekly_counts[week_key]['keyboard'] += keyboard_count # 当周键盘计数加上当前的键盘计数 weekly_counts[week_key]['mouse'] += mouse_click_count # 当周鼠标计数加上当前的鼠标计数 # 每月的统计数据 start_of_month = current_date.replace(day=1) # 计算本月的开始日期 month_key = str(start_of_month) # 将开始日期转换为字符串形式 if month_key not in monthly_counts: # 如果开始日期不在monthly_counts中 monthly_counts[month_key] = {'keyboard': 0, 'mouse': 0} # 初始化当月的数据为{'keyboard': 0, 'mouse': 0} monthly_counts[month_key]['keyboard'] += keyboard_count # 当月键盘计数加上当前的键盘计数 monthly_counts[month_key]['mouse'] += mouse_click_count # 当月鼠标计数加上当前的鼠标计数 # 重置计数器 keyboard_count = 0 # 重置键盘计数器为0 mouse_click_count = 0 # 重置鼠标计数器为0 # 保存统计数据 save_counts() # 调用save_counts函数保存数据 # 更新UI update_ui() # 调用update_ui函数更新UI界面 # 监听键盘事件 def on_press(key): global keyboard_count # 声明使用全局变量 keyboard_count += 1 # 键盘计数器加1 update_counts() # 调用update_counts函数更新统计数据 # 监听鼠标点击事件 def on_click(x, y, button, pressed): if pressed: # 如果鼠标被按下 global mouse_click_count # 声明使用全局变量 mouse_click_count += 1 # 鼠标计数器加1 update_counts() # 调用update_counts函数更新统计数据 # 清空统计数据 def clear_counts(): global daily_counts, weekly_counts, monthly_counts, keyboard_count, mouse_click_count # 声明使用全局变量 daily_counts = {} # 清空daily_counts字典 weekly_counts = {} # 清空weekly_counts字典 monthly_counts = {} # 清空monthly_counts字典 keyboard_count = 0 # 重置键盘计数器为0 mouse_click_count = 0 # 重置鼠标计数器为0 save_counts() # 保存清空后的统计数据 update_ui() # 更新UI界面 # 刷新统计数据 def refresh_counts(): load_counts() # 加载统计数据 update_ui() # 更新UI界面 # 更新UI界面 def update_ui(): today = str(datetime.now().date()) # 获取当前日期并转换为字符串形式 this_week = str(datetime.now().date() - timedelta(days=datetime.now().date().weekday())) # 获取本周开始日期并转换为字符串形式 this_month = str(datetime.now().date().replace(day=1)) # 获取本月开始日期并转换为字符串形式 keyboard_daily_label.config(text=f"今天键盘使用次数: {daily_counts.get(today, {}).get('keyboard', 0)}") # 更新今天键盘使用次数标签 mouse_daily_label.config(text=f"今天鼠标点击次数: {daily_counts.get(today, {}).get('mouse', 0)}") # 更新今天鼠标点击次数标签 keyboard_weekly_label.config(text=f"本周键盘使用次数: {weekly_counts.get(this_week, {}).get('keyboard', 0)}") # 更新本周键盘使用次数标签 mouse_weekly_label.config(text=f"本周鼠标点击次数: {weekly_counts.get(this_week, {}).get('mouse', 0)}") # 更新本周鼠标点击次数标签 keyboard_monthly_label.config(text=f"本月键盘使用次数: {monthly_counts.get(this_month, {}).get('keyboard', 0)}") # 更新本月键盘使用次数标签 mouse_monthly_label.config(text=f"本月鼠标点击次数: {monthly_counts.get(this_month, {}).get('mouse', 0)}") # 更新本月鼠标点击次数标签 # 导出统计数据 def export_data(): export_type = export_combo.get() # 获取导出选择框的值 if export_type == '今日': # 如果选择今日 data_to_export = daily_counts.get(str(current_date), {}) # 获取今日的统计数据 elif export_type == '本周': # 如果选择本周 start_of_week = current_date - timedelta(days=current_date.weekday()) # 计算本周开始日期 data_to_export = weekly_counts.get(str(start_of_week), {}) # 获取本周的统计数据 elif export_type == '本月': # 如果选择本月 start_of_month = current_date.replace(day=1) # 计算本月开始日期 data_to_export = monthly_counts.get(str(start_of_month), {}) # 获取本月的统计数据 else: return # 如果是其他选项,返回 file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")]) # 打开文件保存对话框 if file_path: # 如果选择了文件路径 with open(file_path, 'w') as f: # 打开文件,以写入模式 f.write(f"键盘使用次数: {data_to_export.get('keyboard', 0)}\n") # 写入键盘使用次数 f.write(f"鼠标点击次数: {data_to_export.get('mouse', 0)}\n") # 写入鼠标点击次数 # 启动键盘和鼠标监听 def start_listener(): listener_kb = keyboard.Listener(on_press=on_press) # 创建键盘监听器 listener_kb.start() # 启动键盘监听器 listener_ms = mouse.Listener(on_click=on_click) # 创建鼠标监听器 listener_ms.start() # 启动鼠标监听器 # 创建主窗口 root = tk.Tk() # 创建主窗口 root.title("键盘和鼠标使用次数统计") # 设置窗口标题 # 使用grid布局管理器来实现自适应 root.grid_rowconfigure(0, weight=1) # 设置grid行0的权重为1 root.grid_columnconfigure(0, weight=1) # 设置grid列0的权重为1 # 创建统计标签 keyboard_daily_label = ttk.Label(root, text="今天键盘使用次数: 0") # 创建今天键盘使用次数标签 keyboard_daily_label.grid(row=0, column=0, padx=10, pady=10, sticky="nsew") # 将标签放置在grid的第0行第0列 mouse_daily_label = ttk.Label(root, text="今天鼠标点击次数: 0") # 创建今天鼠标点击次数标签 mouse_daily_label.grid(row=1, column=0, padx=10, pady=10, sticky="nsew") # 将标签放置在grid的第1行第0列 keyboard_weekly_label = ttk.Label(root, text="本周键盘使用次数: 0") # 创建本周键盘使用次数标签 keyboard_weekly_label.grid(row=2, column=0, padx=10, pady=10, sticky="nsew") # 将标签放置在grid的第2行第0列 mouse_weekly_label = ttk.Label(root, text="本周鼠标点击次数: 0") # 创建本周鼠标点击次数标签 mouse_weekly_label.grid(row=3, column=0, padx=10, pady=10, sticky="nsew") # 将标签放置在grid的第3行第0列 keyboard_monthly_label = ttk.Label(root, text="本月键盘使用次数: 0") # 创建本月键盘使用次数标签 keyboard_monthly_label.grid(row=4, column=0, padx=10, pady=10, sticky="nsew") # 将标签放置在grid的第4行第0列 mouse_monthly_label = ttk.Label(root, text="本月鼠标点击次数: 0") # 创建本月鼠标点击次数标签 mouse_monthly_label.grid(row=5, column=0, padx=10, pady=10, sticky="nsew") # 将标签放置在grid的第5行第0列 # 创建清空按钮 clear_button = ttk.Button(root, text="清空统计数据", command=clear_counts) # 创建清空统计数据按钮 clear_button.grid(row=6, column=0, padx=10, pady=10, sticky="nsew") # 将按钮放置在grid的第6行第0列 # 创建刷新按钮 refresh_button = ttk.Button(root, text="刷新统计数据", command=refresh_counts) # 创建刷新统计数据按钮 refresh_button.grid(row=7, column=0, padx=10, pady=10, sticky="nsew") # 将按钮放置在grid的第7行第0列 # 创建导出按钮 export_button = ttk.Button(root, text="导出统计数据", command=export_data) # 创建导出统计数据按钮 export_button.grid(row=8, column=0, padx=10, pady=10, sticky="nsew") # 将按钮放置在grid的第8行第0列 # 创建导出选择框 export_combo = ttk.Combobox(root, values=['今日', '本周', '本月']) # 创建导出选择框,选项为今日、本周、本月 export_combo.set('今日') # 设置默认选项为今日 export_combo.grid(row=9, column=0, padx=10, pady=10, sticky="nsew") # 将选择框放置在grid的第9行第0列 # 加载统计数据 load_counts() # 加载统计数据 # 启动监听线程 listener_thread = Thread(target=start_listener, daemon=True) # 创建监听线程,目标为start_listener,并设置为守护线程 listener_thread.start() # 启动监听线程 # 启动定时更新UI的线程 root.after(1000, update_ui) # 每秒更新一次UI界面 root.mainloop() # 运行主窗口的事件循环
打包成EXE的文件直接在文章底部下载即可
转载请注明:宗宗酱-(电击小子)++>在python中用ai写了一个键盘鼠标次数统计软件