Python 2.7:检测raw_input上按下的DELETE键

时间:2013-08-16 15:55:22

标签: python input console-application special-characters

我正在准备一个非常简单的脚本,我需要用户输入某些值。在某个时刻,我想提供重用现有值的机会,或者如果用户输入是DELETE键(用户按下DELETE然后按Enter)则删除它,但我似乎无法找到满意的答案(我觉得相当令人惊讶......)这只是一个帮助脚本,所以我试图避免更高级的东西,比如PyHook等等。

这是我感兴趣的块:

if reusable_params:
    for key in list(k for k in config_dict.keys() if k not in ["mac", "base_url", "command_name"]):
        msg = "Enter new value for parameter {0}. Press ENTER to reuse the previous {1}. Press DELETE+ENTER to remove this key.".format(key, config_dict[key])
        input = unicode(raw_input(msg).strip().decode(sys.stdin.encoding))
        logging.debug("input: %s, len(input) %s" % (input, len(input))

按DELETE + Enter将返回一个查找4个字符的字符串:

enter image description here

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您可能需要查看pykeylogger,允许您捕获键盘事件,另一个选项是使用pygame,它具有很棒的键事件支持。

pygame

具体来说,您可能需要查看此pagepygame.keys),

K_DELETE              delete #thanks to @7stud

所以你可以做这样的事情,

key = pygame.key.get_pressed()
        if key[pygame.K_DELETE]:
           #your code here...

pykeylogger ,来自here

import keylogger
import time

now = time.time()
done = lambda: time.time() > now + 60
def print_keys(t, modifiers, keys): print "%.2f   %r   %r" % (t, keys, modifiers)

keylogger.log(done, print_keys)

答案 1 :(得分:0)

您的cmd窗口是一个软件,即计算机程序。当您在cmd窗口中点击删除键时,cmd窗口被编程,以便它不会将删除键(127)的ascii代码添加到存储到目前为止输入的所有键击的数组,即输入缓冲区。相反,当您点击删除键时,cmd窗口被编程为从阵列中删除最后一个键击。它很简单:

key_strokes = []

#get key_code

if key_code == 127:
    key_strokes.pop()
else:
    key_strokes.append(key_code)

问题在于您需要控制生成cmd窗口的程序以更改其行为方式。

最简单的解决方案是让用户输入“d”进行删除 - 而不是点击删除键。

否则,您需要在用户键入时捕获键击。响应击键(而不是等待Enter键)的最佳和最有效的方法是了解Tkinter。您可以向用户显示您创建的窗口 - 所谓的GUI,您可以对其进行编程,以便在用户点击删除键时执行任何操作:

import Tkinter as tk

root = tk.Tk()
root.geometry("300x200")

entry = tk.Entry(root)
entry.pack()

def get_key(event):
    print "You pressed", repr(event.char)
entry.bind("<Key>", get_key)

root.mainloop()

另一种做类似事情的方法是使用curses模块,这是一个巨大的浪费时间。你花在整理诅咒上的时间最好花在学习Tkinter上。

现在,您的代码中发生了什么:

list(k for k in config_dict.keys() if k not in ["mac", "base_url", "command_name"]):

为什么要创建一个生成器,然后在从生成器中提取列表后立即丢弃它?消除发电机步骤有什么问题:

[
    k for k in config_dict.keys() 
    if k not in ["mac", "base_url", "command_name"]
]

如果您使用“nots”而不是列表,那么效率会更高。搜索整个列表不如一个字典查找效率高:

[
    k for k in config_dict.keys() 
    if k not in set(["mac", "base_url", "command_name"])
]