この文書はDr. Corran WebsterさんによるW Widgetsの"Number Dialog"を訳したものです。
訳の公開に快く承諾してくださったDr. Corran Websterさんに感謝いたします。
内容の理解が伴っていないので、おかしいところがあるかもしれません。お気づきの点がございましたら、わたしまでお願いいたします。

[ Number Dialog Image ]

Numberダイアログ


IDEの中でWウィジェットを使う
Numberダイアログ / 計算機
練習

このセクションでは、数値入力を受け付けるシンプルなダイアログボックスを作ってみます。 すこし面白くするために、数値の検証をしてみましょう。入力されたものが数値ならOKボタンをenableにし、そうでないならdisableにします。

IDEで新しいウィンドウを開くことから始めます。そこにプログラムを入力し、IDEの"Run all"コマンドを使って実行します。

はじめに、いくつかのモジュールをインポートしなければなりません:Wkeys、これには便利な定数が含まれています。そしてWASTEconst、これでテキストフィールド内のテキストの配置を変えることができます。

import W
import Wkeys

import WASTEconst

また、数値と適合するような正規表現を準備する必要があります。ここにあげたものは完全ではありません ("-0"の入力が可能です。これは判断が難しい)が、これに適合するものは何でもPythonによって 数値であると認識され、入力できます。

import re
num = re.compile("^-?([1-9][0-9]*|0)(.[0-9]+)?$")

次に、ウィジェットを準備しましょう。モードレスダイアログウィンドウを使います。これに、ユーザへの指示を促すスタティックテキストボックスを持たせます。

w = W.Dialog((200, 92), "Number Dialog")
w.text = W.TextBox((4, 4, -4, 18), "Please enter a number:",
		fontsettings = ("charcoal",0,12,(0,0,0)))

これからが、ダイアログの心臓部です。正規表現を使って入力フィールドの内容を確認し、それが適合するかどうかでOKボタンをenableにしたりdisableにしたりするコールバック、do_key()を設定します。次に入力フィールドそのものを作り、その中にコールバックをパラメータとして渡します。

def do_key(char, modifiers):
	if (char != Wkeys.returnkey and char != Wkeys.enterkey):
		content = w.display.get()
		w.OK.enable(num.match(content))

w.display = W.EditText((4,22,-4,22), "0", callback = do_key,
		fontsettings = ("geneva",0,12,(0,0,0)))

最後に、ボタンを作ります。OKボタンには、最終的な値を表示し、ウィンドウを閉じさせるコールバックdone()を持たせます。"Cancel"ボタンは単純にウィンドウを閉じます。

def done():
	print w.display.get()
	w.close()

w.OK = W.Button((-70, 60, 58,20), "OK", done)
w.cancel = W.Button((-140,60,58,20), "Cancel", w.close)

それから、OKボタンにもう少し付け加えます。OKボタンをこのウィンドウのデフォルトボタンにします。すると、ボタンの周りに強調のリングが付きます;さらにOKボタンのpush()メソッドにenterキーとreturnキーをバインドします。

w.setdefaultbutton(w.OK)
w.bind(Wkeys.returnkey, w.OK.push)
w.bind(Wkeys.enterkey, w.OK.push)

最後に、ダイアログを開いて、最後のひとひねりでテキストフィールド内を右揃えに設定します (入力フィールドが開いたあと、このように直接WASTEエディタをひねるまで待たなければなりません)。

w.open()
w.display.ted.WESetAlignment(WASTEconst.weFlushRight)

これでダイアログを表示でき、IDEウィンドウの一部として実行できます。 何回も実行すると、いくつも独立したウィンドウが作られます。 入力の手間が省けるよう、完成したソースコードを用意しました。

練習

  1. もし、入力された数値がPythonにとって妥当な数値型か確かめたいなら、ビルトイン関数 float()int()long()をtry-exceptの 構文の中で使って検証するのがいい方法です。 プログラムを修正して、入力された数値がPythonにふさわしいかを検証するようにしましょう。
  2. ダイアログを修正して、数値入力のキー入力だけを受け付けるようにしましょう。
  3. 日付かどうかを検証するようにダイアログを修正しましょう。同じように時刻かどうかを検証するダイアログにしましょう。