Python3 PyObjC

Mojave を 10.14.3 にしたけど JXA が NSRect でバグるのはそのまま。
Apple は JXA で GUI を使ってほしくないようだ。
macOS 版 comipoli が全然進まない。。。。。

ならば macOS でも Python に戻してやる!
PyObjC がある、でもデフォルトで入っているのは Python 2.7 だ。
もうさぁ、いいかげんに Python3 にしようよ。
ガッツリと Python2 依存だった Fedora でさえ完全に切り替えたというのに。

Installing PyObjC ? PyObjC ? the Python ? Objective-C bridge

PyObjC は Python3 版もあるのか、3.5 までしか書いていないけど。
多分 3.7 でも動くだろう、よし Python3 をインストールして使うことにする。
何もインストールしないという筆者のポリシーがあるがこればかりはしょーがない。

Top – python.jp

あれ、こんな公式サイトだったかな?
Fedora には常に最新 stable が入っているから覗くこと無かったし。
とにかく macOS 64-bit installer をダウンロードとインストール。
速攻 pip で、Python3 は pip3 を使うのね。

$ pip3 install -U pyobjc

よし、これ以上は余程の機会が無いかぎり何もインストールしないぞ。
ちなみに筆者は Xcode は入れていない、デカすぎなんだよアホか!

よしコッチは NSRect の問題は無いぞ。

pyobjc example. ? GitHub

上記は Python2 では普通に動く。
Python3 では NSWindowDelegate がコンフリクトと出る。
単純に消したら動いたので不要ということみたい。

何故かは知らないけど Python3 で動かしたほうが圧倒的に早い。
新しいぶんチューニングされているのかな?

てか、NSRect はタプルのタプルでいいよってことみたい。
そんなこんなで comipoli のベースを作ってみた。

#!/usr/bin/env python3

import objc
from AppKit import *

class ComipoliWindow(NSWindow): #, NSWindowDelegate):
    #def __init__(self): # いらない
    def initWithFrame_(self, frame):
        self = objc.super(ComipoliWindow, self).initWithContentRect_styleMask_backing_defer_(
            frame,
            NSTitledWindowMask |
            NSClosableWindowMask |
            NSResizableWindowMask |
            NSMiniaturizableWindowMask,
            NSBackingStoreBuffered,
            False)
        self.setTitle_('日本語')
        self.setDelegate_(self)
        return self

    def windowWillClose_(self, sender):
        NSApp.terminate_(sender)

class AppDelegate(NSObject):
    def applicationDidFinishLaunching_(self, notification):
        print('__init__')

NSApplication.sharedApplication()

frame = ((100, 400), (320, 240)) # NSMakeRect(100, 400, 320, 240)
window = ComipoliWindow.alloc().initWithFrame_(frame)
window.makeKeyAndOrderFront_(window)

main_menu = NSMenu.new() # alloc().init() は new() でいい
item_app  = NSMenuItem.new()
main_menu.addItem_(item_app)
menu_app = NSMenu.new()
item_app.setSubmenu_(menu_app)
item_quit = NSMenuItem.new()
item_quit.initWithTitle_action_keyEquivalent_(
    'Quit Comipoli', 'terminate:', 'q')
menu_app.addItem_(item_quit)
NSApp.setMainMenu_(main_menu)

NSApp.setDelegate_(AppDelegate.new())
NSApp.activateIgnoringOtherApps_(True)
NSApp.run()

動くね。

Python だから後でファイル分割もできるしコードも短い。
JXA の無理矢理感が無いのもいい、ただ JXA より初期化は遅い。
これだけで Cocoa は使えるのに Apple は何故 6.1GB もある Xcode を無理矢理ダウンロードさせようとするのやら。