欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Python統(tǒng)計(jì)每天敲了多少次鍵盤

 更新時(shí)間:2024年04月17日 08:34:57   作者:銀空飛羽  
每到年末各大App都會(huì)給你來(lái)一次年度總結(jié),最近突發(fā)奇想,鍵盤是每天必備的工具,為啥不給鍵盤也來(lái)個(gè)工作總結(jié),本文就來(lái)用Python統(tǒng)計(jì)一下每天敲了多少次鍵盤吧

分析

語(yǔ)言用python,實(shí)現(xiàn)方式那必然是要監(jiān)聽鍵盤的輸入信號(hào),然后對(duì)每個(gè)按鍵做統(tǒng)計(jì),最后顯示結(jié)果。

核心代碼

查閱一下,python中有一個(gè)pynput庫(kù)是專門用來(lái)做鍵盤、鼠標(biāo)操作相關(guān)的,可以對(duì)事件進(jìn)行監(jiān)聽,同時(shí)還可以模擬鍵盤、鼠標(biāo)進(jìn)行操作(感覺這個(gè)功能很強(qiáng)大,順帶成為了我后續(xù)的一個(gè)項(xiàng)目的解決方案)。

pip install pynput

直接裝就行,示例代碼如下:

from pynput.keyboard import Listener

def on_press(key):
    pass

def on_release(key):
    pass


with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

很直觀,自己實(shí)現(xiàn)一個(gè)on_press和on_release的方法賦給Listener對(duì)象,啟動(dòng)現(xiàn)成監(jiān)聽即可。其中,on_press和on_release分別代表按下和釋放時(shí)的相應(yīng)操作,傳入的key類型為pynput內(nèi)定的Key類,具體細(xì)節(jié)大家可以看源代碼。

按鍵統(tǒng)計(jì)

有了核心代碼之后,剩下的就是在這個(gè)基礎(chǔ)上進(jìn)行功能擴(kuò)展了,先實(shí)現(xiàn)統(tǒng)計(jì)功能

from pynput.keyboard import Listener

# 單個(gè)按鍵次數(shù)
key_counts = {}

# key格式化函數(shù)
def format_key(key):
    if hasattr(key, 'name'):
        return key.name
    elif hasattr(key, 'vk'):
        if 65 <= key.vk <= 127:
            return chr(key.vk)
        else:
            return str(key.char)

def on_press(key):
    current_key.add(key_id)
    print(key_id)

    if key_counts.get(key_id):
        key_counts[key_id] += 1
    else:
        key_counts[key_id] = 1

def on_release(key):
    pass
        
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

這里我除了引入一個(gè)key_counts來(lái)計(jì)數(shù)之外,還專門寫了一個(gè)key格式化的函數(shù),因?yàn)槿绻鹍ebug的話就會(huì)發(fā)現(xiàn),除了標(biāo)準(zhǔn)的可見字符之外,當(dāng)輸入類似Ctrl+A這種實(shí)際傳入的是一個(gè)不可見的控制字符的十六進(jìn)制編碼,這里將類似的字符做了一層轉(zhuǎn)換。

現(xiàn)在整個(gè)雛形就搞定了。

設(shè)定組合鍵

這個(gè)程序是要后臺(tái)運(yùn)行的,那么就要考慮兩點(diǎn),程序怎么退出?我怎么看到按鍵的統(tǒng)計(jì)?

于是乎就需要設(shè)定組合鍵來(lái)做一些操作。

from pynput.keyboard import Listener
import time

from ui.TextDialog import create_window_with_text


# 單個(gè)按鍵次數(shù)
key_counts = {}

exit_cmd = {'alt_l', 'ctrl_l', 'shift', 'A'}
show_cmd = {'alt_l', 'ctrl_l', 'shift', 'space'}

current_key = set()

def format_key(key):
    if hasattr(key, 'name'):
        return key.name
    elif hasattr(key, 'vk'):
        if 65 <= key.vk <= 127:
            return chr(key.vk)
        else:
            return str(key.char)

def get_result():
    pass

def cmd_parse():
    if exit_cmd.issubset(current_key):
        get_result()
        return False

    if show_cmd.issubset(current_key):
        get_result()

    return True


def on_press(key):
    key_id = format_key(key)
    current_key.add(key_id)
    print(key_id)

    if key_counts.get(key_id):
        key_counts[key_id] += 1
    else:
        key_counts[key_id] = 1

    if not cmd_parse():
        return False


def on_release(key):
    try:
        key_id = format_key(key)
        current_key.remove(key_id)
    except KeyError:
        pass


with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

根據(jù)代碼,我新增了組合鍵的功能,同時(shí)引入了current_key作為集合變量,來(lái)存儲(chǔ)當(dāng)前按住的按鍵。

  • Ctrl+Shift+Alt+空格:顯示統(tǒng)計(jì)結(jié)果
  • Ctrl+Shift+Alt+A:顯示統(tǒng)計(jì)結(jié)果并退出

值得一提的是,鍵盤on_press或者on_release方法默認(rèn)是沒有返回值的,如果返回False,則就會(huì)退出線程,進(jìn)而結(jié)束程序。

那么如此一來(lái),基礎(chǔ)功能就有了,咱們?cè)傺a(bǔ)充上get_result()這個(gè)用來(lái)顯示統(tǒng)計(jì)結(jié)果的函數(shù)。

...
start_time = time.time()


def time_counter(begin_time, end_time):
    # 根據(jù)傳入的時(shí)間計(jì)算,通過(guò)run_time.round()函數(shù)取整
    runtime = round(end_time - begin_time)
    # 計(jì)算時(shí)分秒
    hour = runtime // 3600
    minute = (runtime - 3600 * hour) // 60
    second = runtime - 3600 * hour - 60 * minute
    # 輸出
    return f'程序運(yùn)行\(zhòng)n{hour}小時(shí) {minute}分鐘 {second}秒\n'

def get_result():

    end_time = time.time()
    counts = dict(sorted(key_counts.items(), key=lambda item: item[1], reverse=True))
    content = ""
    count = 0
    col = 0
    for k, v in counts.items():
        col += 1
        content += f"{k}: {v}\t"
        count += v
        if col == 4:
            col = 0
            content += "\n"

    current_key.clear()

    try:
        max_key = list(counts.keys())[0]
    except:
        max_key = None

    fixed = "\n" + time_counter(start_time, end_time) + f"\n你總共敲了 {count} 下鍵盤\n\n最多使用\n{max_key}"
    print(fixed)
    print(counts)

...

很簡(jiǎn)單就是打印一下

UI界面

控制臺(tái)打印肯定不行,太low了而且還看的不直觀,于是讓ChatGPT簡(jiǎn)單用tkinter搞了個(gè)界面,實(shí)際效果如下:

代碼如下:

import tkinter as tk
from tkinter import ttk

def create_window_with_text(title, fixed_text, data):
    window = tk.Tk()
    window.title(title)

    # 設(shè)置窗口初始大小和在屏幕上居中顯示
    window_width = 400
    window_height = 200
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    center_x = int(screen_width / 2 - window_width / 2)
    center_y = int(screen_height / 2 - window_height / 2)
    window.geometry(f'{window_width}x{window_height}+{center_x}+{center_y}')

    # 創(chuàng)建PanedWindow,分為左右兩塊
    paned_window = tk.PanedWindow(window, orient=tk.HORIZONTAL)
    paned_window.pack(fill=tk.BOTH, expand=1)

    # 左邊的面板,設(shè)置較大的字體
    left_panel = tk.Frame(paned_window, width=100, height=400, bg='white')
    left_panel.pack_propagate(False)
    label = tk.Label(left_panel, text=fixed_text, bg='white', font=("Arial", 12))
    label.pack(side=tk.TOP, fill=tk.BOTH, padx=20)  # padx為文本增加左側(cè)內(nèi)邊距
    paned_window.add(left_panel, stretch="always")

    # 右邊的面板,使用Treeview作為可拖拽的列表
    right_panel = tk.Frame(paned_window, width=100, height=400)
    right_panel.pack_propagate(False)
    tree = ttk.Treeview(right_panel, columns=('Key', 'Count'), show='headings')
    tree.heading('Key', text='按鍵')
    tree.heading('Count', text='次數(shù)')
    tree.column('Key', width=60)  # 調(diào)整列的寬度
    tree.column('Count', width=30)
    tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

    scrollbar = ttk.Scrollbar(right_panel, orient='vertical', command=tree.yview)
    tree.configure(yscroll=scrollbar.set)
    scrollbar.pack(side=tk.RIGHT, fill='y')

    # 將數(shù)據(jù)添加到Treeview
    for key, count in data.items():
        tree.insert('', 'end', values=(key, count))

    paned_window.add(right_panel, stretch="always")

    # 窗口保持在最前面
    window.attributes('-topmost', True)

    # 啟動(dòng)事件循環(huán)
    window.mainloop()

直接將get_result()函數(shù)中print()的部分調(diào)用該函數(shù)傳入?yún)?shù)即可。

以上就是利用Python統(tǒng)計(jì)每天敲了多少次鍵盤的詳細(xì)內(nèi)容,更多關(guān)于Python鍵盤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pytest使用fixture實(shí)現(xiàn)token共享的方法

    Pytest使用fixture實(shí)現(xiàn)token共享的方法

    同學(xué)們?cè)谧鰌ytest接口自動(dòng)化時(shí),會(huì)遇到一個(gè)場(chǎng)景就是不同的測(cè)試用例需要有一個(gè)登錄的前置步驟,登錄完成后會(huì)獲取到token,用于之后的代碼中,本文給大家介紹Pytest使用fixture實(shí)現(xiàn)token共享的方法,感興趣的朋友一起看看吧
    2023-11-11
  • python百行代碼實(shí)現(xiàn)漢服圈圖片爬取

    python百行代碼實(shí)現(xiàn)漢服圈圖片爬取

    這篇文章主要為大家介紹了使用python百行代碼來(lái)實(shí)現(xiàn)漢服圈的圖片爬取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Python中求對(duì)數(shù)方法總結(jié)

    Python中求對(duì)數(shù)方法總結(jié)

    這篇文章主要介紹了Python中求對(duì)數(shù)方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • flask框架實(shí)現(xiàn)修改密碼和免密登錄功能

    flask框架實(shí)現(xiàn)修改密碼和免密登錄功能

    flask是python web開發(fā)的常用框架之一。本文將講述flask如何實(shí)現(xiàn)修改密碼和免密登錄功能
    2021-05-05
  • Mac中升級(jí)Python2.7到Python3.5步驟詳解

    Mac中升級(jí)Python2.7到Python3.5步驟詳解

    本篇文章主要介紹了Mac中升級(jí)Python2.7到Python3.5步驟詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • django頁(yè)面跳轉(zhuǎn)問(wèn)題及注意事項(xiàng)

    django頁(yè)面跳轉(zhuǎn)問(wèn)題及注意事項(xiàng)

    這篇文章主要介紹了django頁(yè)面跳轉(zhuǎn)問(wèn)題及注意事項(xiàng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 一文帶你掌握Python內(nèi)置reversed函數(shù)的使用

    一文帶你掌握Python內(nèi)置reversed函數(shù)的使用

    Python作為一門強(qiáng)大的編程語(yǔ)言,提供了許多內(nèi)置函數(shù)來(lái)處理各種數(shù)據(jù)結(jié)構(gòu)和對(duì)象,本文將詳細(xì)探討reversed函數(shù)的用法、示例代碼以及實(shí)際應(yīng)用場(chǎng)景,需要的可以參考下
    2024-01-01
  • Python Numpy中數(shù)組的集合操作詳解

    Python Numpy中數(shù)組的集合操作詳解

    這篇文章主要為大家詳細(xì)介紹了Python Numpy中數(shù)組的一些集合操作方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-08-08
  • django執(zhí)行原始查詢sql,并返回Dict字典例子

    django執(zhí)行原始查詢sql,并返回Dict字典例子

    這篇文章主要介紹了django執(zhí)行原始查詢sql,并返回Dict字典例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python使用wmi模塊獲取windows下的系統(tǒng)信息 監(jiān)控系統(tǒng)

    python使用wmi模塊獲取windows下的系統(tǒng)信息 監(jiān)控系統(tǒng)

    Python用WMI模塊獲取Windows系統(tǒng)的硬件信息:硬盤分區(qū)、使用情況,內(nèi)存大小,CPU型號(hào),當(dāng)前運(yùn)行的進(jìn)程,自啟動(dòng)程序及位置,系統(tǒng)的版本等信息。
    2015-10-10

最新評(píng)論