Ошибка шины Python CGEventTap

Я получаю ошибку шины всякий раз, когда запускаю этот код Python CGEventTap:

def callback(ent):
    loc = CGEventGetLocation(ent)
    print loc

tap = CGEventTapCreate(
    kCGSessionEventTap,
    kCGHeadInsertEventTap, 
    kCGEventTapOptionDefault,
    CGEventMaskBit(kCGEventMouseMoved),
    callback(CGEventRef) )

loop = CFMachPortCreateRunLoopSource(None, tap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, kCFRunLoopCommonModes)

RunApplicationEventLoop()

Есть ли что-то очевидное, что я упускаю?


person Teak    schedule 14.02.2011    source источник
comment
Вы связываетесь с инфраструктурой ApplicationServices (т.е. не просто importустанавливаете ее)?   -  person jscs    schedule 19.03.2011
comment
@josh Я пробовал все следующее: импортировать objc, импортировать из Foundation *, импортировать из PyObjCTools AppHelper, импортировать из Quartz *, импортировать из AppKit *. Что из этого мне нужно и не нужно? И что вы подразумеваете под связыванием?   -  person Teak    schedule 21.03.2011
comment
Важное примечание: ваш обратный вызов должен возвращать ent, иначе ваша программа не будет пересылать входные события следующим обработчикам, и вы заблокируете свою систему!   -  person notbad.jpeg    schedule 07.12.2016


Ответы (1)


Я пробовал все следующее:... Что из этого мне нужно, а что нет? И что вы подразумеваете под связыванием? - Тик

Отвечаю на ваш комментарий ответом, потому что он не помещается в комментарий. Извини.

Ситуация, пожалуй, немного запутанная. PyObjC содержит целую кучу информации (метаданные и некоторый вспомогательный код) о функциях, объектах и ​​т. д. в фреймворках Apple, но не содержит самого кода (потому что это код Apple, а PyObjC просто скопировать не получится). Используемые вами функции находятся в структуре Apple ApplicationServices. PyObjC хранит информацию об этой структуре в своем модуле Quartz. Итак, часть I: чтобы использовать эти функции в Python, вам нужно получить информацию PyObjC: from Quartz import *.

Часть II заключается в том, что, как я уже сказал, ваше приложение здесь должно знать не только, где находятся метаданные PyObjC, но и где находится код Apple, который вы пытаетесь использовать. Это часть ссылки. (Не похоже, что вы используете Xcode, поскольку вы настраиваете свой собственный цикл выполнения, но в Xcode вы должны перейти в группу Linked Frameworks в своем проекте и добавить в нее ApplicationServices.)

Я думаю, вы используете py2app? Боюсь, я не уверен на 100%, как это сделать, но этот ТАК вопрос может помочь вам начать: Проблема с использованием py2app

Надеюсь, это укажет вам полезное направление.

(Кстати, когда я создал проект с вашим кодом в Xcode и с подключенным фреймворком ApplicationServices, он заблокировал мои устройства ввода, так что единственное, что я мог сделать, это перезагрузиться. Я мог сделать что-то не так, но имейте в виду, что когда вы получите эту ссылку, могут возникнуть другие проблемы с настраиваемым краном. Возможно, вы захотите сначала попробовать сделать это на C/Obj-C, а затем перевести на Python Когда ты знаешь, что это работает.)

person jscs    schedule 21.03.2011
comment
Спасибо. Это очень полезно, как и ветка, на которую вы мне указали. Я попробую некоторые из ваших предложений. И спасибо за предупреждение... - person Teak; 21.03.2011
comment
Рад, что смог помочь. Из истории ваших вопросов я заметил, что вы уже давно работаете над этой головоломкой. Удачи! - person jscs; 22.03.2011
comment
@Teak: Только что увидел упоминание об этой утилите: pfiddlesoft.com/eventtapstestbench в списке рассылки какао-разработчиков. нить. Не пробовал, но может быть вам пригодится. - person jscs; 22.03.2011
comment
@Josh: я работал над этим некоторое время. Возможно ли, чтобы вы каким-то образом прислали мне проект Xcode, который вы сделали, или просто код, так как я человек Python и мало понимаю C и Xcode? Также у меня уже есть Event Taps Testbench (нашел его во время обширных и безуспешных исследований), спасибо. - person Teak; 23.03.2011
comment
@Teak: извините, когда я попробовал это в Xcode (чтобы я мог быть уверен, что это связано), я также использовал Python. Я никогда не удосужился попробовать это на C после перезагрузки. Причина, по которой я предложил использовать C, заключается в том, что я обнаружил, что PyObjC, кажется, имеет самые грубые грани с API-интерфейсами Apple на простом C (в отличие от тех, которые написаны на Objective-C). Если у вас мало практики в C, я думаю, просто проигнорируйте эту идею. Извини. Тем не менее, вы можете довольно легко создать проект Xcode PyObjC и запустить код, который у вас есть. - person jscs; 24.03.2011
comment
@Josh: Итак, когда я помещаю код в Xcode и запускаю его, он делает то, что вы сказали, и моя система зависает. Но когда я запускаю тот же скрипт из проекта Xcode в окне терминала (используя команду: python ‹путь к скрипту›), он возвращает: Ошибка шины. Так что я не знаю, что попробовать дальше... - person Teak; 24.03.2011
comment
@Teak: Хм, боюсь, я тоже не знаю. Я получал SEG_FAULT, когда делал это в командной строке. Я предполагаю, что Python передает какой-то объект обратно на сторону C, и память для этого объекта обрабатывается неправильно, но у меня нет ни малейшего представления, что это может быть. Может быть, опубликуете короткий вопрос в списке рассылки PyObjC? Рональд Уссорен, главный разработчик, кажется достаточно приятным парнем. Это может стать для вас возможностью выучить C! :) - person jscs; 25.03.2011