| ■ | 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)