猫野詩梨帳

かわいいはかしこい

ローマ字をかなに変換したい(願望)(Python)

ローマ字をかなに変換したいと思った.

綴りの確認

ここを参考にした.

https://support.microsoft.com/ja-jp/kb/883232

RomanKanaTable ジェネレーター

よくわからないけどジェネレーターにした.コピーのオーバーヘッドがない気がする.検索するときは頭から検索するしかないので効率が良いかはふめい.辞書でもいいかなと思ったけどかなからローマ字を検索シたい時もあるかなと思った.

from enum import Enum, IntEnum

class SpecialHiraType(Enum):
    Ignore = 0
    Kata = 1
    Special = 2

class TableIndex(IntEnum):
    Roman = 0
    Hira = 1
    Kata = 2

class RomanKanaTable(object):
    common = (
        ('a', 'あ', 'ア'),
        ('i', 'い', 'イ'),
        ('u', 'う', 'ウ'),
        ('e', 'え', 'エ'),
        ('o', 'お', 'オ'),
        ('wha', 'うぁ', 'ウァ'),
        ('whi', 'うぃ', 'ウィ'),
        ('whu', 'う', 'ウ'),
        ('whe', 'うぇ', 'ウェ'),
        ('who', 'うぉ', 'ウォ'),
        ('la', 'ぁ', 'ァ'),
        ('li', 'ぃ', 'ィ'),
        ('lu', 'ぅ', 'ゥ'),
        ('le', 'ぇ', 'ェ'),
        ('lo', 'ぉ', 'ォ'),
        ('xa', 'ぁ', 'ァ'),
        ('xi', 'ぃ', 'ィ'),
        ('xu', 'ぅ', 'ゥ'),
        ('xe', 'ぇ', 'ェ'),
        ('xo', 'ぉ', 'ォ'),
        ('ka', 'か', 'カ'),
        ('ki', 'き', 'キ'),
        ('ku', 'く', 'ク'),
        ('ke', 'け', 'ケ'),
        ('ko', 'こ', 'コ'),
        ('kya', 'きゃ', 'キャ'),
        ('kyi', 'きぃ', 'キィ'),
        ('kyu', 'きゅ', 'キュ'),
        ('kye', 'きぇ', 'キェ'),
        ('kyo', 'きょ', 'キョ'),
        ('kwa', 'くぁ', 'クァ'),
        ('ca', 'か', 'カ'),
        ('ci', 'し', 'シ'),
        ('cu', 'く', 'ク'),
        ('ce', 'せ', 'セ'),
        ('co', 'こ', 'コ'),
        ('qa', 'くぁ', 'クァ'),
        ('qi', 'くぃ', 'クィ'),
        ('qu', 'く', 'ク'),
        ('qe', 'くぇ', 'クェ'),
        ('qo', 'くぉ', 'クォ'),
        ('qya', 'くゃ', 'クャ'),
        ('qyi', 'くぃ', 'クィ'),
        ('qyu', 'くゅ', 'クュ'),
        ('qye', 'くぇ', 'クェ'),
        ('qyo', 'くょ', 'クョ'),
        ('qwa', 'くぁ', 'クァ'),
        ('qwi', 'くぃ', 'クィ'),
        ('qwu', 'くぅ', 'クゥ'),
        ('qwe', 'くぇ', 'クェ'),
        ('qwo', 'くぉ', 'クォ'),
        ('ga', 'が', 'ガ'),
        ('gi', 'ぎ', 'ギ'),
        ('gu', 'ぐ', 'グ'),
        ('ge', 'げ', 'ゲ'),
        ('go', 'こ', 'ゴ'),
        ('gya', 'ぎゃ', 'ギャ'),
        ('gyi', 'ぎぃ', 'ギィ'),
        ('gyu', 'ぎゅ', 'ギュ'),
        ('gye', 'ぎぇ', 'ギェ'),
        ('gyo', 'ぎょ', 'ギョ'),
        ('gwa', 'ぐぁ', 'グァ'),
        ('gwi', 'ぐぃ', 'グィ'),
        ('gwu', 'ぐぅ', 'グゥ'),
        ('gwe', 'ぐぇ', 'グェ'),
        ('gwo', 'ぐぉ', 'グォ'),
        ('sa', 'さ', 'サ'),
        ('si', 'し', 'シ'),
        ('su', 'す', 'ス'),
        ('se', 'せ', 'セ'),
        ('so', 'そ', 'ソ'),
        ('sya', 'しゃ', 'シャ'),
        ('syi', 'しぃ', 'シィ'),
        ('syu', 'しゅ', 'シュ'),
        ('sye', 'しぇ', 'シェ'),
        ('syo', 'しょ', 'ショ'),
        ('sha', 'しゃ', 'シャ'),
        ('shi', 'し', 'シ'),
        ('shu', 'しゅ', 'シュ'),
        ('she', 'しぇ', 'シェ'),
        ('sho', 'しょ', 'ショ'),
        ('swa', 'すぁ', 'スァ'),
        ('swi', 'すぃ', 'スィ'),
        ('swu', 'すぅ', 'スゥ'),
        ('swe', 'すぇ', 'スェ'),
        ('swo', 'すぉ', 'スォ'),
        ('za', 'ざ', 'ザ'),
        ('zi', 'じ', 'ジ'),
        ('zu', 'ず', 'ズ'),
        ('ze', 'ぜ', 'ゼ'),
        ('zo', 'ぞ', 'ゾ'),
        ('zya', 'じゃ', 'ジャ'),
        ('zyi', 'じぃ', 'ジィ'),
        ('zyu', 'じゅ', 'ジュ'),
        ('zye', 'じぇ', 'ジェ'),
        ('zyo', 'じょ', 'ジョ'),
        ('ja', 'じゃ', 'ジャ'),
        ('ji', 'じ', 'ジ'),
        ('ju', 'じゅ', 'ジュ'),
        ('je', 'じぇ', 'ジェ'),
        ('jo', 'じょ', 'ジョ'),
        ('jya', 'じゃ', 'ジャ'),
        ('jyi', 'じぃ', 'ジィ'),
        ('jyu', 'じゅ', 'ジュ'),
        ('jye', 'じぇ', 'ジェ'),
        ('jyo', 'じょ', 'ジョ'),
        ('ta', 'た', 'タ'),
        ('ti', 'ち', 'チ'),
        ('tu', 'つ', 'ツ'),
        ('te', 'て', 'テ'),
        ('to', 'と', 'ト'),
        ('tya', 'ちゃ', 'チャ'),
        ('tyi', 'ちぃ', 'チィ'),
        ('tyu', 'ちゅ', 'チュ'),
        ('tye', 'ちぇ', 'チェ'),
        ('tyo', 'ちょ', 'チョ'),
        ('cha', 'ちゃ', 'チャ'),
        ('chi', 'ち', 'チ'),
        ('chu', 'ちゅ', 'チュ'),
        ('che', 'ちぇ', 'チェ'),
        ('cho', 'ちょ', 'チョ'),
        ('cya', 'ちゃ', 'チャ'),
        ('cyi', 'ちぃ', 'チィ'),
        ('cyu', 'ちゅ', 'チュ'),
        ('cye', 'ちぇ', 'チェ'),
        ('cyo', 'ちょ', 'チョ'),
        ('tsa', 'つぁ', 'ツァ'),
        ('tsi', 'つぃ', 'ツィ'),
        ('tsu', 'つ', 'ツ'),
        ('tse', 'つぇ', 'ツェ'),
        ('tso', 'つぉ', 'ツォ'),
        ('tha', 'てゃ', 'テャ'),
        ('thi', 'てぃ', 'ティ'),
        ('thu', 'てゅ', 'テュ'),
        ('the', 'てぇ', 'テェ'),
        ('tho', 'てょ', 'テョ'),
        ('twa', 'とぁ', 'トァ'),
        ('twi', 'とぃ', 'トィ'),
        ('twu', 'とぅ', 'トゥ'),
        ('twe', 'とぇ', 'トェ'),
        ('two', 'とぉ', 'トォ'),
        ('da', 'だ', 'ダ'),
        ('di', 'ぢ', 'ヂ'),
        ('du', 'づ', 'ヅ'),
        ('de', 'で', 'デ'),
        ('do', 'ど', 'ド'),
        ('dya', 'ぢゃ', 'ヂャ'),
        ('dyi', 'ぢぃ', 'ヂィ'),
        ('dyu', 'ぢゅ', 'ヂュ'),
        ('dye', 'ぢぇ', 'ヂェ'),
        ('dyo', 'ぢょ', 'ヂョ'),
        ('dha', 'でゃ', 'デャ'),
        ('dhi', 'でぃ', 'ディ'),
        ('dhu', 'でゅ', 'デュ'),
        ('dhe', 'でぇ', 'デェ'),
        ('dho', 'でょ', 'デョ'),
        ('dwa', 'どぁ', 'ドァ'),
        ('dwi', 'どぃ', 'ドィ'),
        ('dwu', 'どぅ', 'ドゥ'),
        ('dwe', 'どぇ', 'ドェ'),
        ('dwo', 'どぉ', 'ドォ'),
        ('ltu', 'っ', 'ッ'),
        ('xtu', 'っ', 'ッ'),
        ('ltsu', 'っ', 'ッ'),
        ('na', 'な', 'ナ'),
        ('ni', 'に', 'ニ'),
        ('nu', 'ぬ', 'ヌ'),
        ('ne', 'ね', 'ネ'),
        ('no', 'の', 'ノ'),
        ('nya', 'にゃ', 'ニャ'),
        ('nyi', 'にぃ', 'ニィ'),
        ('nyu', 'にゅ', 'ニュ'),
        ('nye', 'にぇ', 'ニェ'),
        ('nyo', 'にょ', 'ニョ'),
        ('ha', 'は', 'ハ'),
        ('hi', 'ひ', 'ヒ'),
        ('hu', 'ふ', 'フ'),
        ('he', 'へ', 'ヘ'),
        ('ho', 'ほ', 'ホ'),
        ('hya', 'ひゃ', 'ヒャ'),
        ('hyi', 'ひぃ', 'ヒィ'),
        ('hyu', 'ひゅ', 'ヒュ'),
        ('hye', 'ひぇ', 'ヒェ'),
        ('hyo', 'ひょ', 'ヒョ'),
        ('fa', 'ふぁ', 'ファ'),
        ('fi', 'ふぃ', 'フィ'),
        ('fu', 'ふ', 'フ'),
        ('fe', 'ふぇ', 'フェ'),
        ('fo', 'ふぉ', 'フォ'),
        ('fwa', 'ふぁ', 'ファ'),
        ('fwi', 'ふぃ', 'フィ'),
        ('fwu', 'ふぅ', 'フゥ'),
        ('fwe', 'ふぇ', 'フェ'),
        ('fwo', 'ふぉ', 'フォ'),
        ('fya', 'ふゃ', 'フャ'),
        ('fyi', 'ふぃ', 'フィ'),
        ('fyu', 'ふゅ', 'フュ'),
        ('fye', 'ふぇ', 'フェ'),
        ('fyo', 'ふょ', 'フョ'),
        ('ba', 'ば', 'バ'),
        ('bi', 'び', 'ビ'),
        ('bu', 'ぶ', 'ブ'),
        ('be', 'べ', 'ベ'),
        ('bo', 'ぼ', 'ボ'),
        ('bya', 'びゃ', 'ビャ'),
        ('byi', 'びぃ', 'ビィ'),
        ('byu', 'びゅ', 'ビュ'),
        ('bye', 'びぇ', 'ビェ'),
        ('byo', 'びょ', 'ビョ'),
        ('pa', 'ぱ', 'パ'),
        ('pi', 'ぴ', 'ピ'),
        ('pu', 'ぷ', 'プ'),
        ('pe', 'ぺ', 'ペ'),
        ('po', 'ぽ', 'ポ'),
        ('pya', 'ぴゃ', 'ピャ'),
        ('pyi', 'ぴぃ', 'ピィ'),
        ('pyu', 'ぴゅ', 'ピュ'),
        ('pye', 'ぴぇ', 'ピェ'),
        ('pyo', 'ぴょ', 'ピョ'),
        ('ma', 'ま', 'マ'),
        ('mi', 'み', 'ミ'),
        ('mu', 'む', 'ム'),
        ('me', 'め', 'メ'),
        ('mo', 'も', 'モ'),
        ('mya', 'みゃ', 'ミャ'),
        ('myi', 'みぃ', 'ミィ'),
        ('myu', 'みゅ', 'ミュ'),
        ('mye', 'みぇ', 'ミェ'),
        ('myo', 'みょ', 'ミョ'),
        ('ya', 'や', 'ヤ'),
        ('yi', 'い', 'イ'),
        ('yu', 'ゆ', 'ユ'),
        ('ye', 'いぇ', 'イェ'),
        ('yo', 'よ', 'ヨ'),
        ('lya', 'ゃ', 'ャ'),
        ('lyi', 'ぃ', 'ィ'),
        ('lyu', 'ゅ', 'ュ'),
        ('lye', 'ぇ', 'ェ'),
        ('lyo', 'ょ', 'ョ'),
        ('xya', 'ゃ', 'ャ'),
        ('xyi', 'ぃ', 'ィ'),
        ('xyu', 'ゅ', 'ュ'),
        ('xye', 'ぇ', 'ェ'),
        ('xyo', 'ょ', 'ョ'),
        ('ra', 'ら', 'ラ'),
        ('ri', 'り', 'リ'),
        ('ru', 'る', 'ル'),
        ('re', 'れ', 'レ'),
        ('ro', 'ろ', 'ロ'),
        ('wa', 'わ', 'ワ'),
        ('wu', 'う', 'ウ'),
        ('wo', 'を', 'ヲ'),
        ('nn', 'ん', 'ン'),
        ('xn', 'ん', 'ン'),
        ("n'", 'ん', 'ン'),
        ('rya', 'りゃ', 'リャ'),
        ('ryi', 'りぃ', 'リィ'),
        ('ryu', 'りゅ', 'リュ'),
        ('rye', 'りぇ', 'リェ'),
        ('ryo', 'りょ', 'リョ'),
        ('wyi', 'ゐ', 'ヰ'),
        ('wye', 'ゑ', 'ヱ'),
        ('lwa', 'ゎ', 'ヮ')
    )

    wi_we = (
        (('wi', 'うぃ', 'ウィ'), ('we', 'うぇ', 'ウェ')),
        (('wi', 'ゐ', 'ヰ'), ('we', 'ゑ', 'ヱ'))
    )

    xk_lk = (
        (('lka', None, 'ヵ'), ('xka', None, 'ヵ'),
            ('lke', None, 'ヶ'), ('xke', None, 'ヶ')),
        (('lka', 'ヵ', 'ヵ'), ('xka', 'ヵ', 'ヵ'),
            ('lke', 'ヶ', 'ヶ'), ('xke', 'ヶ', 'ヶ')),
        (('lka', 'ゕ', 'ヵ'), ('xka', 'ゕ', 'ヵ'),
            ('lke', 'ゖ', 'ヶ'), ('xke', 'ゖ', 'ヶ'))
    )

    v_vy = (
        (
            ('va', None, 'ヴァ'),
            ('vi', None, 'ヴィ'),
            ('vu', None, 'ヴ'),
            ('ve', None, 'ヴェ'),
            ('vo', None, 'ヴォ'),
            ('vya', None, 'ヴャ'),
            ('vyi', None, 'ヴィ'),
            ('vyu', None, 'ヴュ'),
            ('vye', None, 'ヴェ'),
            ('vyo', None, 'ヴョ')
        ),
        (
            ('va', 'ヴぁ', 'ヴァ'),
            ('vi', 'ヴぃ', 'ヴィ'),
            ('vu', 'ヴ', 'ヴ'),
            ('ve', 'ヴぇ', 'ヴェ'),
            ('vo', 'ヴぉ', 'ヴォ'),
            ('vya', 'ヴゃ', 'ヴャ'),
            ('vyi', 'ヴぃ', 'ヴィ'),
            ('vyu', 'ヴゅ', 'ヴュ'),
            ('vye', 'ヴぇ', 'ヴェ'),
            ('vyo', 'ヴょ', 'ヴョ')
        ),
        (
            ('va', 'ゔぁ', 'ヴァ'),
            ('vi', 'ゔぃ', 'ヴィ'),
            ('vu', 'ゔ', 'ヴ'),
            ('ve', 'ゔぇ', 'ヴェ'),
            ('vo', 'ゔぉ', 'ヴォ'),
            ('vya', 'ゔゃ', 'ヴャ'),
            ('vyi', 'ゔぃ', 'ヴィ'),
            ('vyu', 'ゔゅ', 'ヴュ'),
            ('vye', 'ゔぇ', 'ヴェ'),
            ('vyo', 'ゔょ', 'ヴョ')
        )
    )

    n_single = ((), (('n', 'ん', 'ン'),))

    @classmethod
    def _tableList(cls, old_w, n_single, type_xk_lk, type_v_vy):
        return [
            cls.common,
            cls.wi_we[old_w],
            cls.xk_lk[type_xk_lk.value],
            cls.v_vy[type_v_vy.value],
            cls.n_single[n_single]
        ]

    def __new__(cls, old_w = False, n_single = False,
            type_xk_lk = SpecialHiraType.Kata,
            type_v_vy = SpecialHiraType.Kata):
        for table in cls._tableList(old_w, n_single, type_xk_lk, type_v_vy):
            for item in table:
                yield item

補足

引数について

  • old_w: True にすると wi が ゐ/ヰ, we が ゑ/ヱ になるぞ

  • n_single: True にすると ('n', 'ん', 'ン') が加わるぞ

  • type_xk_lk: ひらがなでの lk, xk のタイプ(下記)

  • type_v_vy: ひらがなでの v, vy のタイプ(下記)

タイプ

  • SpecialHiraType.Ignore: None にするぞ(例 'lka' -> None)

  • SpecialHiraType.Kata: カタカナにするぞ(例 'lka' -> 'ヵ')

  • SpecialHiraType.Special: 特殊文字をつかうぞ(例 'lka' -> 'ゕ')

ToDo

あとはこれをごにょごにょすればローマ字文字列をかなに変換する関数が書ける気がする.

なんとかするところ

  • n + 子音の時の処理

  • 末尾の n

  • 'tta' -> 'った' みたいな促音の入力

プログラミング習得における一番の困難はプログラミングを始めることである(古代ギリシアの諺)

プログラミングを初めてみようかなと思ったはいいが,コンパイラだの環境変数だのエディタだの IDE だのなんだの,いわゆる開発環境の構築で挫折する人は少なくないと思う.私もそうだった.

ということで突然だけど始めるのが簡単なプログラミング言語をいくつか紹介してみようと思う.ただし Windows を想定している.Windows 以外の OS 使っててプログラミングできないなんてことはないと思う.

VBA

もし Microsoft Excel を持っているのなら,Excel 附属の VBA (Visual Basic for Applications) というプログラミング言語が一番初めやすい.

Excel を立ち上げて Alt + f11 を押せば開発環境の構築は終了である.エディタもいらない.あとは標準モジュールを挿入してコードを書けば実行できる.詳しくは vba とかで検索すれば死ぬほど情報が出てくるのでここには書かないが,おそらく始めるまで 5 分もいらない.

他のプログラミング言語を勉強しようとして挫折した人は是非挑戦して欲しい.入門サイトもたくさんあるので情報には困らないと思うが,書籍もたくさん出ているようだ.

実際は Word, PowerPoint, Outlook, Access など他の Office 製品にも VBA は搭載されているのだが,日本語の情報が少ないので Excel が一番始めやすいと思う.

Python(パイソン)

Windows でもインストールが簡単.python.jpの左下のダウンロードと書かれたリンクから進んで,32 ビット PC なら "Windows x86 executable installer", 64 ビット PC なら "Windows x86-64 executable installer" をダウンロードして実行すればよい.

また標準で IDLE という簡単なエディタがついてくる.IDLE から書いたコードをすぐ実行することもできる.Python には "Battery Included" の思想があり,最初からこのような簡易エディタや幅広い標準ライブラリが附属している.

言語自体も簡単かつ強力で,Python をマスターしておけばとりあえず何にでも対応できる.あの Google でも使われている.インデントでブロックを表すのが特徴的で,プログラムが非常にすっきりとした見た目になる.逆にこれが嫌いな人もいるんだけど,個人的にはコードが読みやすくて結構好み.

気をつけなければならないのがバージョンである.現在主流なのはバージョン 3 系だが,ネット上にはいまだに古い 2 系の情報も多い.2 系と 3 系の簡単な見分け方を教えておこう.print "hello" というプログラムが動けば 2 系,エラーが出れば 3 系である(3 系では print ("Hello") と括弧が必要).2 系は早く絶滅してくれ.

また,やや日本語情報が少ないかもしれない.それでも検索すれば入門サイトはそこそこ見つかるので情報は集まると思う.書籍を購入する際には,やはりバージョンに注意.2 系にしか対応していない書籍を誤って購入してしまうと,きっと悲しい気持ちになる.

今は 3 系対応の入門書もたくさんあるみたいなので,迷ったら書店で実際に見てみたり,"python 入門書" とかで検索して調べてみるのもよい.

Haskellハスケル

これは嘘.確かに Haskell Platform というものがあって Windows でも簡単にインストールできるのだが,Haskell は如何せん言語自体が難しい.でも好きな言語だから紹介したかった.

みんな Haskell しようよ〜.おすすめ書籍はこれ.

すごいHaskellたのしく学ぼう!

この本の内容を完全に理解すれば Haskell の 8 割は理解できたことになる.でも残りの 2 割を理解しようと思ったら,仏門に入る必要がある.

まとめ

以上たった3つだったけど,要するに Python がおすすめ.ちょっと難しい言語やってみたいって人は是非 Haskell を試してみて欲しい.いろいろ試したけどだめだ〜って人は VBA から入るのがよい.

Python に(立場が)似ている言語として ruby というものもある.ほとんど使ったことないからよくわからないけど,日本人が開発した言語ということで日本語情報が多いので,もしかしたらこれも始めやすいかも.しらんけど.Python がだめだったらトライしてみるとよい.

おすすめしない言語とか

以下の言語は (Windows だと) 始めるのが難しい気がするのでおすすめしない.

C/C++:ゴミ

C#:そこまで悪くない

Java:あなたとJAVA, 今すぐダウンロード

JavaScript:うんちのげんご

PHP:便器ブラシ

Perl:よくしらん

OCamlWindows ではたいへんらしい

Lisp:情報が少ない

Fortran:学ぶ意味がない

BASIC:なめとんか?

CLISP のインストール (Windows)

Common Lisp の処理系のひとつである CLISP をインストールする方法についてのメモ (Windows).

インストール

  1. http://clisp.org/ へ行く.

  2. Get CLISP と書いてあるところの下の方に win32 というリンクがあるので,そこをクリックする.

  3. しばらくすると clisp-云々.exe みたいなのがダウンロードされるので,適当なところに保存して実行する(このファイルはインストール終了後に削除してよい).

  4. Setup Wizard が起動するので,Next とか I Agree とか Install とかを押していけばインストールされる(インストールする項目などをカスタマイズできるが,とりあえずそのままでよい).Completed と表示されたら Close で閉じてよい.

CLISP (の REPL) の起動

インストールされたことを確認するために,CLISP(の REPL*1)を起動してみる.とくにカスタマイズせずインストールしていれば,デスクトップに GNU CLISP のアイコンができているはずなので,そこから起動できる.起動すると次のような表示が出る.

  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]>

試しに [1]> の後に (+ 1 2) と入力してみよう(入力のあとは常にエンターキーを押す必要がある).

[1]> (+ 1 2)
3

CLISP を終了するには (quit) と入力する(もしくは,よくわからなくなったら×ボタンで閉じることもできる).

[2]> (quit)

コマンドプロンプトからの REPL の起動

コマンドプロンプトからも REPL は起動できる.

まずコマンドプロンプトを立ち上げる.これには幾つか方法があるが簡単なものをいくつか示す.

  • Windows 10 であれば,左下の Cortana(何でも聞いてください)に「コマンドプロンプト」と入力すれば候補に出てくる.

  • windows キー(キーボード左下の windows マークの描いてあるキー)を押しながら R キーを押して「ファイル名を指定して実行」を立ち上げ,cmd と入力して OK を押すことでもコマンドプロンプトを起動できる.

  • デスクトップや適当なフォルダ内で,Shift キーを押しながらマウスの右クリックすると「コマンド ウィンドウをここで開く(W)」というのがあるので,そこからコマンドプロンプトを起動できる.

コマンド プロンプトが立ち上がったら,そこに CLISP と入力(してエンター)することで CLISP(の REPL)が起動できる.あとは同様.

※ コマンド プロンプトから REPL を起動した場合,(quit) で REPL は終了するがコマンド プロンプト自体は終了しない. コマンド プロンプトを終了するにはそのあとに exit と入力する.

アンインストール

もし CLISP が不要になった場合は次の方法でアンインストール(削除)できる.

「コントロールパネル」 -> 「プログラムのアンインストール」 から GNU CLISP を見つけてアンインストールする.

*1:read-eval-print-loop; 対話型評価環境

tkinter.Frame

最近 tkinter を使っているのでせっかくなのでメモを残す

注意

  • python3

  • 正確な情報はもっと信頼できるところから得て下さい

Frame(フレーム)とは

中に他のウィジェットを入れることができる

ウィジェットをグループ化してきれいに配置したりできる

基本的な使い方

import tkinter as tk
root = tk.Tk()

frame = tk.Frame(root)
frame.pack()

# 中にボタンを入れてみる
button = tk.Button(frame, text = 'Button1')
button.pack()

root.mainloop()

f:id:CyLomw:20161108153647j:plain


以降,次の箇所は基本的に省略する

import tkinter as tk
root = tk.Tk()

# ここに処理

root.mainloop()

コンストラクタ (__init__)

__init__(self, master = None, cnf = {}, **kw)

master: 親ウィジェット

cnf, kw: オプション(後述)

cnf は辞書 (dict) を,kw はキーワード引数をとるらしい


例:

cnf = {'background': 'white', 'padx': 10}
frame = tk.Frame(root, cnf,
    borderwidth = 10, relief = tk.RIDGE)
frame.pack()

button = tk.Button(frame, text = 'Button1')
button.pack()

上の例では背景を白,横方向のパディング,外枠の幅とその見た目 (relief) を変更している

f:id:CyLomw:20161108125053j:plain


ちなみに cnf と kw で同じオプションを指定するとどうなるか?

cnf = {'background': 'white', 'padx': 10}
frame = tk.Frame(root, cnf, background = 'red')
frame.pack()

button = tk.Button(frame, text = 'Button1')
button.pack()

f:id:CyLomw:20161108130057j:plain

kw で設定した値になった

基本オプション

よく使うオプション

色や幅に指定できる値については後述

オプション 説明 デフォルト値
background 背景色
bg background に同じ
borderwidth 縁(ボーダー)の幅 0(縁無し)
bd borderwidth に同じ
relief 縁のスタイル(後述) FLAT
padx 水平方向パディング 0
pady 垂直方向パディング 0
width 水平方向長さ(ただし propagation の設定が必要:後述) 0
height 垂直方向長さ(ただし propagation の設定が必要:後述) 0

オプションは __init__ で設定する以外に後から設定することも可能

オプションの設定方法はなぜか複数あるので好きなものを使う

frame['bg'] = 'blue'

frame.config(bg = 'green')

frame.configure(bg = 'yellow')

# config, configure は辞書指定も可能
cnf = {'bg': 'black'}
frame.config(cnf, padx = 100)

ちなみに frame.bg = 'blue' とかはダメなので注意


オプションの取得方法も複数ある

print(frame['bg'])
print(frame.cget('bg'))

オプションの設定とかは基本的に他のウィジェットでも同じ

色について

background などへの色指定には 2 つの方法がある

方法 1. 16進トリプレット表記

16進トリプレット表記が使用できる (#FFFFFF みたいなやつ)

3 桁,6 桁,9 桁で表記できる

# rgb (12 ビットカラー: 4096 色)
frame.config(bg = '#0f0')

# rrggbb (24 ビットカラー: 16777216 色)
frame.config(bg = '#ff6347')

# rrrgggbbb (36 ビットカラー: 68719476736 色)
frame.config(bg = '#e0f1aa35c')

方法 2. 定義されている名前を使う

white, black, red, green, blue, cyan, yellow, magenta などの名前で指定することができる

これ以外にもあるみたいだけど少なくとも上にあげた 8 色については環境依存なしに使用できるみたい?

# マゼンタ
frame.config(bg = 'magenta')

単位について

borderwidth, padx, pady などに設定する値はピクセル単位である

frame = tk.Frame(root, bd = 10)
frame.pack()

button = tk.Button(frame, text = 'Button1')
button.pack()

f:id:CyLomw:20161108163917p:plain

これは bd = '10' のように文字列で指定することもできる

文字列で渡す場合,以下の単位を使うことができる

記号 単位
c センチメートル
i インチ
m ミリメートル
p ポイント(1/72 インチ)

例:

frame = tk.Frame(root, padx = '2c')

relief について

relief オプションでは縁(ボーダー)のスタイル指定ができる

当たり前だけどボーダー幅 (borderwidth) が 0 の場合は意味がない

指定できる値 どんな感じ
FLAT(デフォルト) 平ら(縁は見えず,スペースだけ)
SUNKEN フレームが押されたボタンのように沈む
RAISED フレームがボタンのように盛り上がる
GROOVE 縁が溝のように沈む
RIDGE 縁が尾根のように盛り上がる

f:id:CyLomw:20161108150808p:plain

上の図ではわかりやすいようにウィンドウ (root) の背景色を黒,フレームの背景色を白にしている (borderwidth は 5)

この他に SOLID とかもあるみたいだけど環境依存?


例:relief を RIDGE に設定する

いま import tkinter as tk とインポートしているので tk.RIDGE と書く必要があることに注意する

import tkinter as tk

root = tk.Tk()

frame = tk.Frame(root, bd = 5, relief = tk.RIDGE)
frame.pack()

# 中にラベルを入れる
label = tk.Label(frame, text = 'RIDGE BORDER')
label.pack()

root.mainloop()

f:id:CyLomw:20161108151751p:plain


また,relief の値は文字列でも指定できる

この場合は flat, sunken, raised, groove, ridge と小文字で指定する

例:

frame = tk.Frame(root, bd = 5, relief = 'ridge')

padx, pady について

フレームは中に配置したウィジェットにぴったりくっつく

パディングを設けたいときは padx, pady オプションを使用すればよいが,これは「内側の」パディングである

外側にパディングを設けたい場合は pack, grid の padx, pady オプションを使用する

import tkinter as tk

root = tk.Tk()

# ウィンドウの背景色を黒に設定
root.config(bg = 'black')

# フレームの背景色は白
frame = tk.Frame(root, bd = 5, relief = tk.RIDGE,
    bg = 'white', padx = 10)
frame.pack(pady = 10)

# フレーム内に配置するラベルの背景色は赤
tk.Label(frame, text = 'Label1', bg = 'red').pack()

root.mainloop()

f:id:CyLomw:20161108170708j:plain

上の例では内側の水平 (x) 方向と外側の垂直 (y) 方向にパディングを設けている

propagation と width, height

フレームは中に配置したウィジェットにぴったりくっつくため,フレームの大きさは中のウィジェットの大きさによって決まる

中に配置したウィジェットに関係なくフレームの大きさを制御したい場合は,propagate メソッドを用いて propagation(伝播)の設定を変更する

フレームの propagation

propagation 意味
True(デフォルト) 中のウィジェットにくっつく
False 中のウィジェットにくっつかない

propagation を False にすると,フレームの大きさは width, height オプションで指定した値になる(True の場合これらの値は無視される)

例:

frame = tk.Frame(root, bg = 'blue',
    width = '3c', height = '2c')
frame.propagate(False)
frame.pack()

button = tk.Button(frame, text = 'Button')
button.pack()

f:id:CyLomw:20161108175019j:plain

空のフレームとパディング

propagation が True(デフォルト)の場合,中に何も配置されていないフレームは大きさが 0 のためか borderwidth や padx, pady を設定しても何も表示されない

例:

frame = tk.Frame(root, bd = 5,
    relief = tk.RIDGE, padx = 10, pady = 10)
frame.pack()

# ボタンをフレーム内に設置
tk.Button(frame, text = 'Button1').pack()

f:id:CyLomw:20161108155026j:plain


frame = tk.Frame(root, bd = 5,
    relief = tk.RIDGE, padx = 10, pady = 10)
frame.pack()

# こんどはフレーム外に設置
tk.Button(root, text = 'Button1').pack()

f:id:CyLomw:20161108153647j:plain


propagation を False にし width, height を設定するとボーダーは表示されるが,padx, pady は機能しない

frame = tk.Frame(root, bd = 5,
    relief = tk.RIDGE, padx = '10c', pady = '10c',
    width = '1c', height = '1c')
frame.propagate(False)
frame.pack()

f:id:CyLomw:20161108180018j:plain


空のフレームを用いてパディングしたい場合は propagation を False にして width, height を設定すればよい

もしくは,propagation が True(デフォルト)のままでも,pack や grid で配置する際にパディングを設定するとパディングされる(フレーム外のパディングのため)

tk.Frame(root).pack(pady = '1c')
tk.Button(root, text = 'Button1').pack()

f:id:CyLomw:20161108171239j:plain

上の例ではフレームを用いてボタンの上に 1 cm * 2 = 2 cm のパディングを設けている

その他のオプション

オプション 説明 デフォルト値
class
colormap
container
cursor
highlightcolor
highlightbackground
highlightthickness
takefocus
visual

次のページに詳しい

http://effbot.org/tkinterbook/frame.htm

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/frame.html

メソッド

Frame には固有のメソッドはない(たぶん)のでウィジェット共通のメソッドのみ(親クラスの Misc とか BaseWidget とかで定義されている)

次のページに詳しい

http://epydoc.sourceforge.net/stdlib/Tkinter.Frame-class.html

pack, grid, place など配置方法について

次のページに詳しい

http://www.shido.info/py/tkinter2.html

化学検定 (QMA)

QMA で化学検定が始まったのでさくっと SSS とってきました. いまのところ 3638 点で 129 位らしいです.初日なのに結構やってる人いますねえ.

内容はさほど難しくなくて物理・化学の予習☆5とかのほうがよっぽどきついです. あと元素問題が非常に多いので周期表覚えていけば S くらい取れると思います.

今作では予習では正答がわかるのですが,それ以外では表示されないので検定でも間違えた問題の正答がわかりません. ノートとるなり録画するなりして正答確認するしかないのが面倒くさいですね.

SSS でゲットできる通り名が面白いので是非挑戦してみてください.

ブログのデザインを変えました

アロエちゃんだよ〜

今日はお便りが来てるよ! 「QMA の物理・化学を極めるためにアトキンス物理化学なる本を買ったのですが,一向に正答率が上がりません」

・お答え アトキンス物理化学は物理化学の本であって物理・化学の本じゃないよ〜

アロエちゃんでした〜

クイズのゲーム

クイズのゲーム難しすぎ!!!!

QMA には組というものがあって上位をとっていると上の組に,下位をとっていると下の組に移る仕組みであり,これによってだいたい同じレベルの人たちと対戦できる.だいたい上から二番目のフェニックス組にいるのだが時間帯によってはまったく人がいない (com ばかり) のですぐ最上位のドラゴン組に上がってしまう.しかしドラゴン組は最上位の組だけあって強すぎて三連続コンビニ(ビリ決定戦)送りなどざらである.もっとフェニ組増えるか俺がドラゴン組に耐えられるようになれ!!!!

最近は物理化学を投げまくってます.