在python中用ai写了一个键盘鼠标次数统计软件

2025-03-04 166 0

今天上班的时候突发奇想,想看一下自己上一天班到底点了多少次鼠标和键盘来统计一下。然后去各大的软件下载站去下载这类型的软件,太老了有的都打不开然后自己就直接用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的文件直接在文章底部下载即可


相关文件下载地址
©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!

相关文章

阿里云学生领300元无门槛券(全日制、非全日制学生均可领取)
小米手环可以开通重庆公交卡
python中的列表(数组)知识点总结
switch与match的用法与区别
Python的if-elif分支语句运用-BIM计算器代码小项目
面试少儿编程老师

发布评论

在python中用ai写了一个键盘鼠标次数统计软件