2014-03-29 5 views
1

내 파이썬 코드에서 마우스 클릭 이벤트를 잡으려고합니다. (창에서 생성 된 Gtk 창이 나타나지 만 화면의 아무 곳에서나 클릭하는 것이 아닙니다.) 몇 가지 검색을 한 후에 스레드가 xlib (위대함, 내가 이미 가지고있는 종속성)에 대해 이야기하는 것을 발견했습니다.파이썬에서 마우스 클릭 잡기

from Xlib import display, X 

display = display.Display() 
root = display.screen().root 
root.change_attribute(event_mask = X.ButtonPressMask | X.ButtonReleaseMask) 

while True: 
    event = root.display.next_event() 
    print(event) 

문제는이 오류 또는 다른 방법 않습니다에 대한 어떤 생각이있는 경우

X protocol error: 
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 146, sequence_number = 9, major_opcode = 2, minor_opcode = 0 

...이 코드 덩어리가 오류를 던지고 난 그냥 좋은 문서를 찾을 수 있다는 것입니다 이건 정말 도움이 될거야!

답변

1

BadAccess 여기에 "다른 클라이언트가 이미 선택한 경우 한 클라이언트 만 선택할 수있는 이벤트 유형을 선택하려고했습니다." x11 protocol documentation에서

이 ChangeWindowAttributes 요청 (오피 코드 2는이 요청 코드, 리소스 ID = 146 루트 승리 ID입니다) :

여러 클라이언트가 동일한 창에 입력을 선택할 수 있습니다; 그들의 이벤트 마스크는 연결이 끊어져 있습니다. 이벤트가 생성되면 모든 관심있는 클라이언트에게 이보고됩니다. 그러나 한 번에 하나의 클라이언트 만 SubstructureRedirect를 선택할 수 있습니다. 한 번에 한 클라이언트 만 을 선택하면 ResizeRedirect가 선택되고 한 번에 하나의 클라이언트 만 ButtonPress에 대해 을 선택할 수 있습니다. 이러한 제한 사항을 위반하면 액세스 오류 인 이 발생합니다.

봅니다 만 가능한 솔루션으로

+0

감사를 ButtonReleaseMask을 선택 즉, 실제로 오류 문제를 해결한다 (그리고 링크가 지금 내 북마크에 있습니다). 하지만 여전히 마우스 보도/릴리스 이벤트를 잡을 수 있습니다 ... – Paulloz