我正在准备一个非常简单的脚本,我需要用户输入某些值。在某个时刻,我想提供重用现有值的机会,或者如果用户输入是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个字符的字符串:
提前谢谢!
答案 0 :(得分:1)
您可能需要查看pykeylogger
,允许您捕获键盘事件,另一个选项是使用pygame
,它具有很棒的键事件支持。
pygame
:
具体来说,您可能需要查看此page(pygame.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"])
]