[PR]今日のニュースは
「Infoseek モバイル」


メッセージダイアログの表示

 Python/TkinterではTcl/Tkと同様、 コマンド一行で簡単なメッセージダイアログを表示させることができます。

from Tkinter import *
import tkMessageBox, os.path, string

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

class App(Frame):
  def init(self):
    self.master.title("ディレクトリに含まれるファイル数")
    a = Label(self, text=j("ディレクトリ名:"))
    self.ea = Entry(self, width=40)
    f = Frame()
    b = Button(f, text=j("検索"), command=self.search)
    c = Button(f, text=j("終了"), command=self.quit)
    for e in (b, c): e.pack(side=LEFT, padx=3, pady=3)

    a.pack(side=TOP, anchor=W, pady=5)
    self.ea.pack(side=TOP, pady=5)
    f.pack(side=TOP, anchor=E, pady=5)

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

  def search(self):
    # getメソッドで取得します。
    dirname = self.ea.get()
    # メッセージダイアログはこのように1行書くだけで表示できます。
    if os.path.isdir(dirname):
      tkMessageBox.showinfo(title="Found:",
        message=str(len(os.listdir(dirname))) + " file(s) exists.")
    else:
      tkMessageBox.showerror(title="Ootto!",
        message="Ootto! " + dirname + " is not a directory.")

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

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

スクリーンショット

 メッセージダイアログは、モジュールtkMessageBox で定義されているので、これをインポートします。 最も簡単にメッセージダイアログを出すには、 tkMessageBoxモジュールのshowinfoshowerrorなどの関数を使います。 これらはそれぞれの意味に即したアイコンなどを自動的につけてくれるので、 プログラマはtitle=でタイトルを、message=で表示させたい文字列を指定するだけで OKです。


textvariableと変数オブジェクト

ところで、前のサンプルですが

a = Label(self, text=j("ディレクトリ名:"))
self.ea = Entry(self, width=40)
f = Frame()
b = Button(f, text=j("検索"), command=self.search)

このように、エントリウィジェットにだけself.をつけて、 このクラスのインスタンス変数に保持させています。 その理由は、あとになってこのエントリに入力されている内容を取得するために

dirname = self.ea.get()

と、getメソッドを使うためで、チェックボックスなどでも同じことをしようとしたら self.をつけたインスタンス変数にウィジェットをもつ必要が出てきます。
 しかし、これとは別に、Tcl/Tkのエントリには-textvariable というオプションがあって、 エントリに入力された内容を常に保持するTcl変数を指定することができるのですが、 Tcl/Tkの方法をまねてTkinterでも

val="文字列"
a = Entry(self, width=30, textvariable=val)

とやっても、これはエラーになってしまいます。 正解は、Tkinter独自のStringVarIntVarDoubleVar のどれかのクラスのオブジェクトを作り、それをtextvariable= オプションに渡すようにします。

self.var = StringVar()
a = Entry(self, width=30, textvariable=self.var)

これらの変数オブジェクトに値をセットしたり、値を取り出したりするには、

self.var.set("/usr/local/bin/python")
path = self.var.get()

set()get()のペアが使えます。 まさにツイストペアなのです。(素で流してください) 上のように、StringVarには文字列型の値を保持させることができます。 ということは?もちろん、IntVarには整数を、DoubleVar には浮動小数点数を保持させることができるわけです。 上の例をtextvariableオプションを使って書き直してみましょう。

from Tkinter import *
import tkMessageBox, os.path, string

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

class App(Frame):
  def init(self):
    self.master.title("ディレクトリに含まれるファイル数")
    a = Label(self, text=j("ディレクトリ名:"))
    self.dirnamevar = StringVar()
    self.dirnamevar.set("C:/usr/lang/python")
    ea = Entry(self, width=40, textvariable=self.dirnamevar)
    f = Frame()
    b = Button(f, text=j("検索"), command=self.search)
    c = Button(f, text=j("終了"), command=self.quit)
    for e in (b, c): e.pack(side=LEFT, padx=3, pady=3)

    a.pack(side=TOP, anchor=W, pady=5)
    ea.pack(side=TOP, pady=5)
    f.pack(side=TOP, anchor=E, pady=5)

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

  def search(self):
    # getメソッドで取得します。
    dirname = self.dirnamevar.get()
    # メッセージダイアログはこのように1行書くだけで表示できます。
    if os.path.isdir(dirname):
      tkMessageBox.showinfo(title="Found:",
        message=str(len(os.listdir(dirname))) + " file(s) exists.")
    else:
      tkMessageBox.showerror(title="Ootto!",
        message="Ootto! " + dirname + " is not a directory.")

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

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

 なお、エントリのtextvariable=と同様に、チェックボタン(Checkbutton) やラジオボタン(Radiobutton)にはvariable=というオプションがありますが、 これらにもこのStringVarやその一族が同様に使えます。

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