如何用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
相关产品推荐
相关产品推荐

