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 をインストールして使うことにする。
何もインストールしないという筆者のポリシーがあるがこればかりはしょーがない。
あれ、こんな公式サイトだったかな?
Fedora には常に最新 stable が入っているから覗くこと無かったし。
とにかく macOS 64-bit installer をダウンロードとインストール。
速攻 pip で、Python3 は pip3 を使うのね。
$ pip3 install -U pyobjc
よし、これ以上は余程の機会が無いかぎり何もインストールしないぞ。
ちなみに筆者は Xcode は入れていない、デカすぎなんだよアホか!
よしコッチは NSRect の問題は無いぞ。
上記は 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 を無理矢理ダウンロードさせようとするのやら。