2013-06-05 5 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) 

하지만 내 "입력" 기능은 1 개 인자를 그래서 나는 형식을 인쇄 가능한 (쓰기)에 Key.CONSTANT를 변환하는 방법을 찾으려면 (입력 및 로깅에 사용되는 키 상수 만). 가능한가?

+0

그 기호는 utf-8에서 단순히 인쇄 할 수 없습니다. http://www.charbase.com/e022-unicode-invalid-character 그 이유는 ' 로그에서 아무 것도 볼 수 없습니다. 다른 키를 시도해 본 적이 있습니까? – pypat

+0

예, 인쇄 할 수 없다는 것을 알고 있습니다. 그래서 내가이 질문을했습니다. Sikuli Key.CONSTANT를 "Key.ALT"와 같은 인쇄 가능한 형식으로 변환하는 방법이 있습니까? –

답변

1

if/else 솔루션은 완벽합니다. 나는 마침내 내장 파이썬 기능을 디렉토리getattr을 사용하여 만족스러운 해결책을 발견

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

: 당신이 원하는 경우에, 당신은 대신에 사전을 사용할 수 있습니다.

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)