PyObjC」タグアーカイブ

pythonhosted

あれ? https://pythonhosted.org/pyobjc/index.html が消えている。

PyObjC Document はコッチに移動(?)したようだ。
Introduction ? PyObjC – the Python to Objective-C bridge
以前からあったのかどうかは知らない、基本 Fedora 屋なので。

というわけで NSTextField Tips 追加。
NSTextField – L’Isola di Niente
短いけど実用には充分にしたつもり。

しかし textDidChange: は何故デリゲートではなくメソッドなんだよ。
NSButton に至っては target, action 指定だし、この統一感の無さが macOS の中身。
macOS の洗練された見た目と統一された操作性はこの糞みたいな Cocoa で作られている。
GTK+ も GTK3 にならなかったらこんな感じになっていたんだろうな。

次は NSTextView にしようと思ったけど。
NSTextView – AppKit | Apple Developer Documentation
Rich Text のことばかりみたいだなぁ、ヤル気しねぇ。
NSSlider, NSComboBox あたりにしよう、のんびりと。

Quick Action @ change72dpi (PyObjC)

自作アプリの件が片付いたので PyObjC Tips の続きを。
NSButton – L’Isola di Niente

NSButton だけで長くなってしまったのでコレだけで一頁にした。
3D タッチ処理がこんなに簡単だとは思わなかった、AppKit スゲェ。

それはそうと、sips がおかしい、サイズが半分の半分になるんだが。
今まで下記クイックアクションに登録したコードでイケていたのに急に何故だ?
macOS をクイックアクションで拡張 – L’Isola di Niente

スクリーンショットが必要なのに困った。
緊急で自作スクリプトを作る。

#!/usr/local/bin/python3

import sys, os
from AppKit import *
from Quartz.CoreGraphics import *

os.chdir(os.path.dirname(sys.argv[1]))
args = sys.argv[1:]

for s in args:
    name = os.path.basename(s)
    src_image = NSImage.alloc().initWithContentsOfFile_(name)
    img = NSBitmapImageRep.imageRepWithData_(src_image.TIFFRepresentation()).CGImage()
    h = CGImageGetHeight(img) // 2
    w = CGImageGetWidth(img) // 2
    ctx = CGBitmapContextCreate(None, w, h, 8, 4 * w, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast)
    CGContextDrawImage(ctx, CGRectMake(0, 0, w, h), img)
    imgref = CGBitmapContextCreateImage(ctx)
    out_image = NSImage.alloc().initWithCGImage_size_(imgref, (w, h))
    bmp = NSBitmapImageRep.imageRepWithData_(out_image.TIFFRepresentation())
    data = bmp.representationUsingType_properties_(NSBitmapImageFileTypePNG, {})
    data.writeToFile_atomically_(f'72dpi-{name}', True)

change72dpi という拡張子の無い名前にして +x パーミッション。

Comipoli で使っているコードをフルパス用に書き換えて同じ結果になるように。
クイックアクションは以前の command+shift+S でコピーを作って。

/Users/sasakima-nao/bin/change72dpi "@"

に書き換え保存。

とにかく、GUI を使うなら何をするにもフルパスが必要。
まさかのシバンまでフルパスに、いやシンボリックリンクなんだけどさすがに通った。
だからパスが通っているディレクトリに入れる必要は無いけどなんとなく。

Linux みたくフルパスを使うことのほうが珍しいにしてくれよ。
セキュリティなんて SELinux みたいなので充分だろ。

Graphics

18 日に上げた PyObjC Tips の日付が 2018 年になってた!
よしさっさと更新してごまかしてまえwwwww

PyObjC Tips – L’Isola di Niente

てか、AppKit に関しては comipoli で必要な API しか調べていないんで。
全部調べて作ってだとスゲェ時間が掛かるので細切れで出すことにした。
ゴールデンウイークは 10 連休なのでもちっと進めたい。

あっちにも書いたけど。
Cocoa Dev Central: Cocoa Graphics with Quartz
Cocoa Dev Central: Cocoa Graphics with Quartz II
すごく解りやすいよね。
今後のページ作りの参考にしよう。

cairo だとココとか。
Cairo samples

日本語でこの手を探すとスクショだらけな Xcode の使い方解説ばかりで困る。
Visual Studio もそうだったね、Mac も Windows も本当に何も変わらないなと。
インストールのスキルしか上がらない Node.js よりマシ程度。
日本人はコードを書くのが嫌いなんだろうか?

import objc

今頃気が付いた。
PyObjC の AppKit に objc は含まれていた。

#!/usr/bin/env python3

#import objc
from AppKit import *

いらなかったんや!!!

PyObjC Tips ページを作っていて気がつく、書いていないのに動いたって。
作っているうちに又気がついたことがあったらコッチに書くわ、ネタがないし。
しかしゼロから作るのはどう書くか迷って中々進まない。

Python3 plistlib

plistlib — Mac OS X .plist ファイルの生成と解析 ? Python 3.7.2 ドキュメント

こんなモジュールが Python3 のデフォルトであったのか!
Info.plist の編集はどうやろうか迷ったけどコイツでいこう。

#!/usr/bin/env python3

import plistlib

PATH = 'Comipoli.app/Contents/Info.plist'

doctype = dict(
    CFBundleDocumentTypes = [
        dict(
            CFBundleTypeExtensions = ['cbz'],
            CFBundleTypeRole = 'Viewer',
            LSTypeIsPackage = False,
            NSPersistentStoreTypeKey = 'Binary'
        ),
        dict(
            CFBundleTypeExtensions = ['cbr'],
            CFBundleTypeRole = 'Viewer',
            LSTypeIsPackage = False,
            NSPersistentStoreTypeKey = 'Binary'
        ),
        dict(
            CFBundleTypeExtensions = ['cb7'],
            CFBundleTypeRole = 'Viewer',
            LSTypeIsPackage = False,
            NSPersistentStoreTypeKey = 'Binary'
        ),
        dict(
            CFBundleTypeExtensions = ['pdf'],
            CFBundleTypeRole = 'Viewer',
            LSTypeIsPackage = False,
            NSPersistentStoreTypeKey = 'Binary'
        )
    ]
)
plist = None
with open(PATH, 'rb') as fp:
    plist = plistlib.load(fp)

plist.update(doctype)

with open(PATH, 'wb') as fp:
    plistlib.dump(plist, fp)

make_plist.py

他のアプリの Info.plist を参考にこれだけ追加してみた。
アイコンを変更することもできるけどまあいいや。

ということで、ビルドスクリプトの最後でコレを実行。
/Applications に移動して pdf で二本指タップしてみる。

Comipoli.app が見事に登録されています。
選択すれば開くことができるしデフォルトアプリにすることもできる。

ところで、0.0.2 は app 化すると引数起動ができなかった。

(旧) Cocoaの日々: アプリ起動時に渡される引数の処理

App にすると application:openFiles: でしか引数を受け付けしないのね。
Window を作るのを applicationWillFinishLaunching: に変更。
application:openFiles: のほうが良さげなのでこっちで処理。
よし日本語でも問題なく引数付き起動できるようになった。

しかし PyObjC だけでここまで作れるとは自分でも思わなかった。
macOS でも Python3 は使うべき。