Python/Tkinterと日本語

Cafe de Paison: Python/Tkinterと日本語

 Python/Tkinterで日本語を表示するには、少しだけ小細工が必要です。

from Tkinter import *
from tkFont import *

# ネイティブ文字コードで書かれた文字列strをUTF-8に変換して返します。
#def j(str, encoding="japanese.euc_jp"):
def j(str, encoding="japanese.shift_jis"):
  u = unicode(str, encoding)
  return u.encode("utf8")

class App(Frame):
  def init(self):
    self.master.title("日本語を使う")
    a = Label(self, text="Hello, World", fg="#800040")
    a.config(font=Font(family="helvetica", weight=NORMAL, size=18))
    b = Button(text=j("終了"))
    b.config(command=self.cmd_clicked)
    a.pack(side=TOP, padx=5, pady=5)
    b.pack(side=RIGHT, padx=5, pady=5)

  def cmd_clicked(self):
    self.master.destroy()

  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.pack(); self.init()

if __name__ == "__main__":
  app = App(); app.mainloop()
# end.

スクリーンショット

 Tkinterは、 内部で文字列をUnicode文字のコード表現の一種UTF-8で保持していますが、 Pythonは文字列をバイトの並びそのままで保持しています。 そこで、Tkinterのウィジェットのラベルなどに非英語圏の文字列を表示するには、 対応するコーデック(Codec)をインストールしたうえで、 上のようにして意識的に文字列をUTF-8に変換する必要があります。 ここではよく知られたJapaneseCodecs-1.4.4を入手、インストールした上で使用しています。

 なお、非常に残念なことですが、現在のPython 2.2 + Tkinter では、MS-WindowsであるとUNIX(Xウィンドウシステム)であるとを問わず、 日本語の文字を入力することができません(*1)。 これは、大きなネックとなります。ちなみに、Qt 2.x はこのルーチンを完備しているため、 Python 2.x + Qt 2.x で作成した PyQtなら日本語の入出力や表示が可能です。 これは、別のページで紹介しています。

(*1)Tcl/Tkはバージョン8.3で既に日本語入力が可能で、 Tk自体は日本語を扱うことができます。

ちょっとメモ(4) - フォントの使用
Tkinterでは、フォントはtkFontモジュールをインポートし、 Fontクラスのインスタンスをウィジェットのfont=オプションに渡すことで指定できます。 Fontは「ファミリー、ウェイト、サイズ」 の3つのそれぞれ省略可能な引数をとるコンストラクタを持ち、
  f=Font(family="helvetica", weight=NORMAL, size=18)
  a=Label(self, text="ももも", font=f)
このように指定できます。weight=にはNORMAL、BOLD、ITALIC、BOLDITALIC の記号定数があらかじめ定義されています。 OSにどんなフォントのファミリーが用意されているかを知るには、 tkFont.families()メソッドを使えばOKです。

また、Windows環境では、下のように 「MS 明朝」「MS ゴシック」 などの日本語のフォント名が使えます。 ただし、もともとTkでは、フォントのfamilyを「Helvetica」にすれば日本語の文字はゴシックで、 「Times」にすれば明朝で表示されるので、 意識して日本語のTrueTypeフォント名を使う必要は通常はないはずです。

from Tkinter import *
import tkFont

def j(str, encoding="japanese.shift_jis"):
  u = unicode(str, encoding)
  return u.encode("utf8")

class App(Frame):
  def quit(self):
    self.master.destroy()

  def init(self):
    jstr = j("日本語の見出し")
    font1 = tkFont.Font(family=j("MS 明朝"), size=24, weight=NORMAL);
    la = Label(self, text=jstr, font=font1, fg="#600000")
    ba = Button(self, text=j("終了"), command=self.quit)
    for e in [la, ba]: e.pack(side=TOP, padx=5, pady=5)

  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.master.title('Sample')
    self.init()
    self.pack()

if __name__ == "__main__": app = App(); app.mainloop()
# end.

スクリーンショット

セクションのサブメニューに戻る
(first uploaded 2001/08/05 last updated 2002/03/11)


[PR]当たる!無料占いで仕事鑑定:大人気!無料占い『スピリチュアルの館』