You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python制作支持特殊按键的104键键盘热力图?

实现自定义键盘热力图(支持特殊按键)

核心思路

要实现自定义键盘热力图,关键是建立按键与键盘图片上坐标的映射关系,然后基于按键频率在对应位置绘制半透明的热力色块,叠加在键盘底图上。


步骤1:创建按键-坐标映射字典

找一张104键标准键盘的PNG图片,逐个记录每个按键(包括特殊键)在图片上的矩形区域坐标(左上角x、左上角y、宽度w、高度h)。可以用Windows画图、GIMP等工具定位坐标。

示例映射字典(需补全所有104键):

key_positions = {
    # 普通字母键
    'a': (100, 200, 50, 50),
    'b': (155, 200, 50, 50),
    # 特殊按键
    'Key.space': (100, 350, 400, 50),
    'Key.lctrl': (50, 300, 60, 50),
    'Key.backspace': (500, 150, 80, 50),
    'Key.shift_l': (50, 250, 80, 50),
    # 其余按键自行补充...
}

步骤2:优化按键记录(可选但推荐)

现有代码每次按键都写入文件,频繁IO影响性能,改成退出时一次性写入:

from pynput.keyboard import Key, Listener

the_keys = [] 

def on_press(key):  
    the_keys.append(str(key).replace("'", ""))  # 直接转成字符串存储

def on_release(key):
    if key == Key.esc:
        # 退出时批量写入日志
        with open('keylog.txt', 'w') as log:
            log.write('\n'.join(the_keys))
        return False

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

步骤3:统计按键频率

读取日志文件,统计每个按键的出现次数:

from collections import Counter

def count_key_frequencies(log_path='keylog.txt'):
    with open(log_path, 'r') as f:
        keys = [line.strip() for line in f if line.strip()]
    return Counter(keys)

key_counts = count_key_frequencies()

步骤4:绘制热力图

用Matplotlib加载键盘底图,叠加热力色块:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.colors import Normalize
import matplotlib.cm as cm

# 1. 加载键盘背景图
keyboard_img = plt.imread('104keyboard.png')  # 替换为你的键盘图片路径
fig, ax = plt.subplots(figsize=(12, 6))  # 尺寸匹配图片比例
ax.imshow(keyboard_img)

# 2. 设置颜色映射:频率越高颜色越深
max_count = max(key_counts.values()) if key_counts else 1
norm = Normalize(vmin=0, vmax=max_count)
cmap = cm.get_cmap('Reds')  # 可替换为'Blues'/'Greens'等

# 3. 遍历按键绘制热力色块
for key, count in key_counts.items():
    if key not in key_positions:
        continue  # 跳过未映射的按键
    x, y, w, h = key_positions[key]
    # 创建半透明矩形色块
    rect = Rectangle((x, y), w, h, color=cmap(norm(count)), alpha=0.5)
    ax.add_patch(rect)

# 4. 调整显示效果
ax.axis('off')
# 添加颜色条(可选)
sm = cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
fig.colorbar(sm, ax=ax, orientation='vertical', fraction=0.02, pad=0.01)

# 保存或显示热力图
plt.savefig('keyboard_heatmap.png', dpi=300, bbox_inches='tight')
plt.show()

关键注意事项

  • 坐标映射准确性:确保每个按键的坐标、尺寸与键盘图片完全匹配,避免热力色块错位。
  • 特殊按键命名统一:日志中的特殊按键名称(如Key.space)必须与映射字典的键名完全一致,防止遗漏。
  • 视觉效果调整:可通过修改cmap(颜色方案)和alpha(透明度)参数,平衡热力效果与底图可读性。

内容的提问来源于stack exchange,提问作者the OpBot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:12:34