HOME Python 書き込む

Appnedix 2. Tkinter での日本語の取り扱い


text 属性のある Widget には日本語を書くことができます。coding を shift_jis または euc-jp にし、 日本語の文字列リテラルの前に u をつければ日本語が表示されます。

つまり、

  1. ソースコードの2行目に # -*- coding: shift_jis -*- と書く。(または # -*- coding: euc-jp -*-
  2. 日本語のリテラルの前に u をつける。例えば、 u"日本語のひらがな、カタカナ、漢字"
もしうまくいかない場合は指定したコードでプログラムが保存されているかどうか、 'Python Unicode Codecs collection' がインストール されているかどうかを調べてみてください。 例を以下に示します。

1. 日本語の Label, Button, Listbox

上で述べた処理を行った、日本語を表示するスクリプトです。 sobaya.py
01:     #! /usr/bin/env python
02:     # -*- coding: shift_jis -*-
03:     """
04:     sobayas.py 
05:     
06:     日本語のテスト, Use Japanese with Tkinter
07:     
08:     June 28, 2005
09:     """
10:     
11:     
12:     import Tkinter as Tk
13:     import sys
14:     
15:     MENU = [u"天丼", u"カツ丼", u"うな重", u"親子丼",  u"盛りそば", u"掛けそば", u"鍋焼きうどん",  
16:             u"月見うどん", u"きつねうどん", u"狸うどん", u"素うどん", u"山菜そば", u"ととろそば",
17:             u"鴨せいろ", u"天せいろ"]
18:     
19:     
20:     
21:     class ScrolledListbox(Tk.Listbox):
22:         """ Listbox with vertical scroll bar """
23:         
24:         def __init__(self, master, **key):
25:             self.frame = Tk.Frame(master)
26:             self.yscroll = Tk.Scrollbar (self.frame, orient=Tk.VERTICAL)
27:             self.yscroll.pack(side=Tk.RIGHT, fill=Tk.Y, expand=1)
28:             key['yscrollcommand']=self.yscroll.set
29:             Tk.Listbox.__init__(self, self.frame, **key)
30:             self.pack(side=Tk.LEFT, fill=Tk.BOTH, expand=1)
31:             self.yscroll.config(command=self.yview)
32:     
33:             # Copy geometry methods of self.frame 
34:             for m in (Tk.Pack.__dict__.keys() + Tk.Grid.__dict__.keys() + Tk.Place.__dict__.keys()):
35:                 m[0] == '_' or m == 'config' or m == 'configure' or \
36:                     setattr(self, m, getattr(self.frame, m))
37:     
38:     
39:     
40:     
41:     class Frame(Tk.Frame):
42:         
43:         def __init__(self, master=None):
44:             Tk.Frame.__init__(self, master)
45:             self.master.title(u"Tk そば屋")
46:             intro = Tk.Label(self, font=('Helvetica', '12'),  justify=Tk.LEFT, wraplength='10c', width=40, 
47:                              text = u"いらっしゃい、ご注文は?\n(マウス左ダブルクリックで注文してください)")
48:             intro.pack()
49:             f = Tk.Frame(self, bd=3, relief=Tk.RIDGE)
50:             f.pack(fill=Tk.BOTH, expand=1)
51:             
52:             self.listbox = ScrolledListbox(f, font=('Helvetica', '10'))
53:             self.listbox.grid(row=0, column=0, rowspan=2, padx=5, pady=5, sticky=Tk.N+Tk.S)
54:             self.listbox.bind("<Double-Button-1>", self.select_menu)
55:             self.listbox.insert(Tk.END, *MENU)
56:     
57:             self.echo = Tk.StringVar()
58:             lecho = Tk.Label(f, textvariable=self.echo, font=('Helvetica', '18', 'bold'), fg='#CC0000', width=20)
59:             lecho.grid(row=0, column=1, sticky=Tk.E + Tk.W)
60:     
61:             b = Tk.Button(f, text=u"まいどあり", font=('Helvetica', '14', 'bold'), fg='#000066', command = sys.exit)
62:             b.grid(row=1, column=1)
63:     
64:         def select_menu(self, event):
65:             i = self.listbox.index(Tk.ACTIVE)
66:             self.echo.set(MENU[i] + u" 一丁!")
67:         
68:                 
69:     ##------------------------------------------------ 
70:     
71:     if __name__ == '__main__':
72:         f = Frame()
73:         f.pack()
74:         f.mainloop()
下のような Window が表示されると思います。

2. Entry で取得した文字列を日本語で表示する。

ラベルなどと、同様の処理を行えば、Entry から取得した日本語文字列も表示できます。

jentry.py

01:     #! /usr/bin/env python
02:     # -*- coding: shift_jis -*-
03:     """
04:     jentry.py 
05:     
06:     japanese entry
07:     
08:     June 30, 2005
09:     """
10:     
11:     
12:     import Tkinter as Tk
13:     
14:     
15:     FONT = ('Helvetica', '12')
16:     WIDTH = 30
17:     
18:     class Frame(Tk.Frame):
19:         
20:         def __init__(self, master=None):
21:             Tk.Frame.__init__(self, master)
22:             l_name = Tk.Label(self, font=FONT, text=u"お名前")
23:             l_address  = Tk.Label(self, font=FONT, text=u"ご住所")
24:             self.s1 = Tk.StringVar()
25:             self.s2 = Tk.StringVar()
26:             self.s3 = Tk.StringVar()
27:             e1 = Tk.Entry(self, textvariable = self.s1, width=WIDTH, font=FONT)
28:             e2 = Tk.Entry(self, textvariable = self.s2, width=WIDTH, font=FONT)
29:             e3 = Tk.Entry(self, textvariable = self.s3, width=WIDTH, font=FONT)
30:             self.bind_class("Entry", '<Return>', self.make_echo)
31:             
32:             self.s = Tk.StringVar()
33:             l_echo = Tk.Label(self, font=FONT, textvariable = self.s, anchor=Tk.W, justify=Tk.LEFT)
34:     
35:             l_name.grid(row=0, column=0, padx=5, pady=2)
36:             l_address.grid(row=1, column=0, padx=5, pady=2)
37:             e1.grid(row=0, column=1, padx=5, pady=2)
38:             e2.grid(row=1, column=1, padx=5, pady=2)
39:             e3.grid(row=2, column=1, padx=5, pady=2)
40:             l_echo.grid(row=3, column=0, columnspan=2, padx=30, pady=10, sticky=Tk.W + Tk.E)
41:     
42:     
43:         def make_echo(self, event):
44:             self.s.set(u'お名前:\t%s\nご住所:\t%s\n\t%s\n' % (self.s1.get(), self.s2.get(), self.s3.get()))
45:         
46:                 
47:     ##------------------------------------------------ 
48:     
49:     if __name__ == '__main__':
50:         f = Frame()
51:         f.pack()
52:         f.mainloop()
下のような Window が表示されると思います。

3. 日本語のファイルのIO

ファイルを読み込むときに、.decode, 書き出すときに .encode メソッドを 使うと日本語が書かれたファイルの IO ができます。

簡易日本語エディタ jmemo.py の 80 行目(読み込み)と 87 行目(書きだし)を参考にしてください。jmemo.py を実行するとこのような Window が生成します。