2013-08-16 33 views
0

我正在準備一個非常簡單的腳本,我需要用戶輸入某些值。在某一點上,我想提供重用現有值的機會,或者如果用戶輸入是DELETE鍵(用戶按下DELETE,然後按Enter鍵),則刪除它,但我似乎無法找到滿意的答案(我覺得很奇怪......)這只是一個幫手腳本,所以我試圖避免更先進的東西,如PyHook和類似的東西。Python 2.7:檢測在raw_input上按下的DELETE鍵

這是我感興趣的塊:

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鍵返回一個Unicode尋找4個字符的字符串:

enter image description here

預先感謝您!

+0

'raw_input'不能捕獲單個按鍵(除了顯然的Enter鍵)。如果你真的想保持腳本簡單,那麼最好的選擇就是放棄這個功能,而不是輸入任何輸入來顯示先前輸入的命令列表,然後再按回車鍵執行最後一個命令) –

回答

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) 
+0

退格(ascii code 8)不等於刪除(ascii code 127)。如果你向下看它的名單顯示:'K_DELETE' – 7stud

+1

@ 7stud謝謝!我沒有意識到這一點。 – enginefree

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"] 
] 

而且如果你用一組爲「窮人」,而不是一個列表,將會變得更加高效。其在整個列表中搜索並不像一個字典查找高效:

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