ローマ字をかなに変換したい(願望)(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 の 8 割は理解できたことになる.でも残りの 2 割を理解しようと思ったら,仏門に入る必要がある.
まとめ
以上たった3つだったけど,要するに Python がおすすめ.ちょっと難しい言語やってみたいって人は是非 Haskell を試してみて欲しい.いろいろ試したけどだめだ〜って人は VBA から入るのがよい.
Python に(立場が)似ている言語として ruby というものもある.ほとんど使ったことないからよくわからないけど,日本人が開発した言語ということで日本語情報が多いので,もしかしたらこれも始めやすいかも.しらんけど.Python がだめだったらトライしてみるとよい.
おすすめしない言語とか
以下の言語は (Windows だと) 始めるのが難しい気がするのでおすすめしない.
C/C++:ゴミ
C#:そこまで悪くない
JavaScript:うんちのげんご
PHP:便器ブラシ
Perl:よくしらん
Lisp:情報が少ない
Fortran:学ぶ意味がない
BASIC:なめとんか?
CLISP のインストール (Windows)
Common Lisp の処理系のひとつである CLISP をインストールする方法についてのメモ (Windows).
インストール
http://clisp.org/ へ行く.
しばらくすると clisp-云々.exe みたいなのがダウンロードされるので,適当なところに保存して実行する(このファイルはインストール終了後に削除してよい).
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()
以降,次の箇所は基本的に省略する
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) を変更している
ちなみに cnf と kw で同じオプションを指定するとどうなるか?
cnf = {'background': 'white', 'padx': 10} frame = tk.Frame(root, cnf, background = 'red') frame.pack() button = tk.Button(frame, text = 'Button1') button.pack()
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()
これは bd = '10'
のように文字列で指定することもできる
文字列で渡す場合,以下の単位を使うことができる
記号 | 単位 |
---|---|
c | センチメートル |
i | インチ |
m | ミリメートル |
p | ポイント(1/72 インチ) |
例:
frame = tk.Frame(root, padx = '2c')
relief について
relief オプションでは縁(ボーダー)のスタイル指定ができる
当たり前だけどボーダー幅 (borderwidth) が 0 の場合は意味がない
指定できる値 | どんな感じ |
---|---|
FLAT(デフォルト) | 平ら(縁は見えず,スペースだけ) |
SUNKEN | フレームが押されたボタンのように沈む |
RAISED | フレームがボタンのように盛り上がる |
GROOVE | 縁が溝のように沈む |
RIDGE | 縁が尾根のように盛り上がる |
上の図ではわかりやすいようにウィンドウ (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()
また,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()
上の例では内側の水平 (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()
空のフレームとパディング
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()
frame = tk.Frame(root, bd = 5, relief = tk.RIDGE, padx = 10, pady = 10) frame.pack() # こんどはフレーム外に設置 tk.Button(root, text = 'Button1').pack()
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()
空のフレームを用いてパディングしたい場合は propagation を False にして width, height を設定すればよい
もしくは,propagation が True(デフォルト)のままでも,pack や grid で配置する際にパディングを設定するとパディングされる(フレーム外のパディングのため)
tk.Frame(root).pack(pady = '1c') tk.Button(root, text = 'Button1').pack()
上の例ではフレームを用いてボタンの上に 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 など配置方法について
次のページに詳しい