代码和软件在公众号【走神研究所】发送【键盘】关键字获取。
这是一款基于python的桌面小工具,能够实时显示你敲击键盘的按键,并且当摁下“J”、“N”、“T”、“M”时会发出坤音。
具体视频 演示和代码原理在这里打开程序,随意摁下键盘,小坤坤就会张开嘴巴,显示键盘。
当触发到绝密时机的时候(键盘jntm)就会发出美妙的坤音。
现在给大家讲下整个程序的原理。
首先是资源文件,小人的图片是我从网上找的坤坤手办,用Photoshop抠出来的,在嘴部增加一个黑色圆圈,代表张嘴。再加上一个气泡框用来显示文字,图片资源就搞定了。
声音资源则是从网上找到坤坤本人的采访音频,截取出来对应的声音片段即可。
代码原理比较简单,主要基于pynput库,这个库可以监测和模拟键盘和鼠标输入,我们用这个库来实现对键盘输入的监控。
from pynput.keyboard import Listener, GlobalHotKeys, Key
class KeyBoardLister():
def __init__(self, on_press_func, on_release_func, hot_keys_func_map=None):
self.on_press = on_press_func
self.on_release = on_release_func
# 开启热键监控
if hot_keys_func_map is not None:
self.start_monitor_hotkey(hot_keys_func_map)
self.start_monitor_keyboard()
# 键盘监测
def start_monitor_keyboard(self):
self.listener = Listener(on_press=self.on_press, on_release=self.on_release)
self.listener.start()
# 热键监控-非阻塞
def start_monitor_hotkey(self, hot_keys_func_map):
h = GlobalHotKeys(hot_keys_func_map)
h.start()
gui采用pyqt,摁下键盘,显示张嘴小人,松开键盘,显示闭嘴小人,这样就可以实现说话的效果。
def set_char(self, ch):
if ch is None:
return
if ch in self.ch2audio:
self.play_radio(self.ch2audio[ch])
if ch == "j" or ch == "J":
ch = "只因"
# 设置字母
if len(ch) == 1:
# 显示字母
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPixelSize(35)
font.setBold(True)
self.lab_content.setFont(font)
self.lab_content.setStyleSheet("color:black;")
self.lab_content.move(40, 28)
else:
# 显示字母
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPixelSize(25)
font.setBold(True)
self.lab_content.setFont(font)
self.lab_content.setStyleSheet("color:black;")
self.lab_content.move(28, 28)
self.lab_content.setText(ch)
self.lab_content.adjustSize()
# 张嘴
self.lab.setPixmap(QtGui.QPixmap(resource_path(os.path.join("imgs", "cai2.png"))))
# 长时间没有触发则要回归到最初状态
def reset_char(self):
# 清除文字
self.lab_content.setText("")
self.lab_content.adjustSize()
# 闭嘴
self.lab.setPixmap(QtGui.QPixmap(resource_path(os.path.join("imgs", "cai1.png"))))
当键盘匹配到特定输入时,就会播放对应音频,包括“jntm”四个字母,以及摁下快捷键“ctrl+j”时会播放“你干嘛”。
播放音频用的库是playsound库,这里要注意播放音频需要新开一个子线程,否则会阻塞主线程继续监听键盘。
# 开线程放音乐,避免阻断主流程,实现可以同时放多个radio
def play_radio(self, path):
t = threading.Thread(target=playsound.playsound, args=(path,))
t.start()
短短200行代码实现的坤音键盘,你还不来试试?