2013-06-05 50 views
0

我的Sikuli腳本使用Python模塊記錄所有操作日誌記錄。當我嘗試將輸入的鍵常量寫入日誌時,會發生問題。作爲一個例子,我用打印功能,因爲它需要一個字符串太:打印(書寫)Sikuli鍵常量

print((Key.ALT).encode('utf-8'))#exception not thrown but nothing readable is printed 
print(Key.ALT)     #UnicodeEncodeError: 'ascii' codec can't encode character u'\ue022' in position 0: ordinal not in range(128) 

當然,我可以一個變量比較所有可能的密鑰contants:

myKey = Key.ALT 
if(myKey==Key.CTRL): 
    print('ctrl pressed') 
elif(myKey==Key.ALT): 
    print('alt pressed') 
#etc… 

但這不是最有效的方法我猜。我還可以做一些其他的解決方法是這樣的:

print(「Key.ALT pressed」) 
keyDown(Key.ALT) 

但我想找到一種方法,Key.CONSTANT轉化爲一個可(寫入)格式,這樣我的「打字」 功能只需要1個參數(只有用於鍵入和記錄的鍵常量)。可能嗎?

+0

該標誌是根本就沒有UTF-8 http://www.charbase.com/e022-unicode-invalid-character見諸報端,這就是爲什麼你不」沒有看到日誌中的任何內容。你有沒有試過不同的鑰匙,並檢查你得到了什麼? – pypat

+0

是的,我知道它是不可打印的。這就是我問這個問題的原因。有沒有辦法將Sikuli Key.CONSTANT轉換爲可打印的格式,例如「Key.ALT」? –

回答

1

您的if/else解決方案非常好。如果你願意,你可以使用,而不是一本字典:

keyStrings = { Key.CTRL : "control-key", 
       Key.ALT : "alt-key", 
       Key.SHIFT : "shift-key" } 

print(keyStrings[myKey]) 
+0

你是對的,我想沒有比較值的更好的解決方案。 –

+0

我希望我能從Key類獲得一個常量列表,但我認爲這是不可能的。 dir(Key)返回字符串列表,因此不能用於比較。 –

+0

我認爲這包含所有的常量。不過,可能對你的目的不是很有幫助。 https://github.com/sikuli/sikuli/blob/develop/sikuli-script/src/main/java/org/sikuli/script/Key.java –

1

我終於找到滿意的解決方案通過使用內置Python函數DIRGETATTR。沒有必要通過一個定義所有值之一:

import re 
#defining dictionary containing all possible Key values: 
keyDict = {} 
for k in dir(Key): 
    if(re.search("^__",k)): 
     break 
    else: 
     keyDict[k] = getattr(Key,k) 

#example of dictionary usage for comparison: 
myKey = Key.TAB 
for d in keyDict.keys(): 
    if(keyDict[d]==myKey): 
     print("Found key = " + d)