События wx Python MainL oop и Quartz CGEvent в отдельном потоке вызывают ошибку недопустимой инструкции - PullRequest
0 голосов
/ 06 февраля 2020

Я хотел бы понять причину сбоя, которую я вижу с событиями wx Python и Quartz в macOS Catalina и python 3.8.1. Вот минимальный python скрипт

import Quartz
import threading
import time
import wx

def press_key():
    time.sleep(10)
    Quartz.CGEventPost(Quartz.kCGHIDEventTap, Quartz.CGEventCreateKeyboardEvent(None, 6, True))
    Quartz.CGEventPost(Quartz.kCGHIDEventTap, Quartz.CGEventCreateKeyboardEvent(None, 6, False))

class MainFrame(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        worker = threading.Thread(target=press_key)
        worker.start()
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.Show(True)

app = wx.App(False)
frame = MainFrame(None, 'Small editor')
app.MainLoop()

Здесь wx Python событие l oop выполняется в основном потоке, а отдельный поток публикует сообщения Quartz CGEvents. При публикации CGEvent происходит сбой сценария с ошибкой недопустимой инструкции.

Illegal instruction: 4

Может ли кто-нибудь помочь мне понять причину ошибки? Более простой тест, где CGEvents публикуются в отдельном потоке, но wx.App.MainL oop () не выполняется, работает без ошибок.

...