今天上班的时候突发奇想,想看一下自己上一天班到底点了多少次鼠标和键盘来统计一下。然后去各大的软件下载站去下载这类型的软件,太老了有的都打不开然后自己就直接用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的文件直接在文章底部下载即可
如涉及侵权,请通过邮件:gouweicaosheji#163.com与我联系处理。
宗宗酱