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


メインウィジェットのテンプレートを作ろう

 ところで、ここまで見てきたような簡単なサンプルの場合、 Tkinterの最初のウィンドウを作って表示する処理はほとんど共通です。 そこで、これらの処理をPythonクラスとして定義してしまい、 毎回毎回コードを全部書かなくてもよい工夫をしてみました。 次がそのテンプレートになるクラスU4Widgetのコードです。

#
# u4.py (ネーミングに特に意味はないですが、
#        このu4がモジュール名となります)
#
from Tkinter import *
from tkFont  import *
from tkMessageBox import *

# Tkウィジェットのテンプレートです。
class U4Widget(Frame):
  def quit(self):
    self.master.destroy()

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

  # これをオーバーライドしてウィジェットの初期化処理を書きます。
  def init(self):
    pass # please override this

  # コンストラクタ
  def __init__(self, title="untitled", autoloop=1, master=None):
    Frame.__init__(self, master)
    self.init()
    self.pack()
    self.master.title(title)
    # autoloopが真の場合、自動的にイベントループに入ります。
    if autoloop: self.mainloop()
# end.

こうすることにより、以前のサンプルは次のようにさらに簡潔になります。

from u4 import *

class A(U4Widget):
  def init(self):
    la = Label(self, text="Hello, World.", fg="#600000")
    b = Button(self, text=self.j("終了"), command=self.quit)
    for e in (la, b):
      e.pack(side=TOP, pady=5)

a = A("Sample")
# end.

おお、なンて簡単なンだッ(勝手に言えや)


チェックボタンとラジオボタン

 ここからは、上の「u4.py」をインポートしてさらに他のウィジェットのご紹介とまいりましょう。 まずは、チェックボタンとラジオボタンです。

from u4 import *

class A(U4Widget):
  def init(self):
    font = Font(family="Times", size=14)
    la = Label(self, text=self.j("おやつにしますか:"), font=font)
    fr = Frame(self, relief=GROOVE, bd=2)
    self.fruitsVar = StringVar()
    self.bananaVar = IntVar()
    ra = { }
    for e in ("りんご", "メロン", "もも"):
      ra[e] = Radiobutton(fr, text=self.j(e), variable=self.fruitsVar, value=e)
      ra[e].pack(side=TOP, anchor=W)
    c = Checkbutton(self, text=self.j("バナナはおやつに含まない"),
                    variable=self.bananaVar, onvalue=1, offvalue=0)
    b = Button(self, text="OK", command=self.ok)
    la.pack(side=TOP, pady=5)
    fr.pack(side=TOP, pady=5, padx=10, anchor=W)
    c.pack(side=TOP, pady=5, padx=20)
    b.pack(side=TOP, pady=5, padx=20, anchor=E)
    self.bananaVar.set(1)
    self.fruitsVar.set("メロン")

  def ok(self):
    a = self.fruitsVar.get()
    showinfo(message=self.j("選んだ果物は" + a + "ですね。"))
    if self.bananaVar.get() == 1:
      showinfo(message=self.j("ちなみにバナナはおやつに含みません。"))
    self.quit()

a = A("Fruits")
# end.

スクリーンショット

 どっちから行きましょうか?では、 アルファベット順ということでチェックボタンから。

self.bananaVar = IntVar()
c = Checkbutton(self, text=self.j("バナナはおやつに含まない"),
                variable=self.bananaVar, onvalue=1, offvalue=0)
self.bananaVar.set(1)
# ...
if self.bananaVar.get() == 1:
  showinfo(message=self.j("ちなみにバナナはおやつに含みません。"))

 ここでも、チェックボタンの状態(ON or OFF)を保持させる変数として、 エントリのtextvariableの場合と同様変数オブジェクトが顔を出しています。 チェックボタンの場合ONかOFFという値の特性からIntVarクラスを使って 1か零を保持させています(onvalue=オプションとoffvalue=オプション) が、もちろんStringVarなどを使っても構いません。

 ラジオボタンの場合は、ボタングループという概念があります。 つまり、幾つかのラジオボタンのうち、通常はどれかひとつだけを選択できる (どれかを選択すると、他の全てのボタンは非選択状態になる) というルールですが、 Tkinterのラジオボタンは、これをStringVarを使うことで実現できています。 つまり、複数のラジオボタンに、「同じStringVarオブジェクトに、 おのおの違う値を持たせる」ことで、このようなラジオボタンの動作が実現できます。

self.fruitsVar = StringVar()
ra = { }
for e in ("りんご", "メロン", "もも"):
  ra[e] = Radiobutton(fr, text=self.j(e),
                      variable=self.fruitsVar, value=e)
self.fruitsVar.set("メロン")
# ...
a = self.fruitsVar.get()
showinfo(message=self.j("選んだ果物は" + a + "ですね。"))

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