Open tora-muscle opened 1 year ago
イベントが発生した際に行う処理の定義 このようなプログラミングをイベントに対する応答を主に記述することからイベ ント駆動型 (event-driven) プログラミングと呼びます.
- M: Model, アプリケーションの骨格を与える計算対象のモデル,基本的に GUI とは独立
- V: View,Model で得られた結果をユーザに示すプログラム,GUI が担う
- C: Control,モデルに対するユーザの操作のためのプログラム,GUI が担う
それぞれにウィ ンドウの描画などは異なった方法で行われます.これらの OS/ウィンドウ環境の差 異を吸収し,共通に使える GUI 用のフレームワークとして Tcl/Tk があります.
以下のような加算のみの電卓を考えます.
- 0~9の10キーと,C(クリア),+(足し算)=(計算) の 13 個のボタンと
- 数値を示す1行の文字入出力で構成されます.
- 0~9 は電卓と同様に入力中の数字の最小桁を挿入します.(入力中の数字を 10 倍して押されたキーの数字 を加える)
- C は数値を0にします.
- キーは入力された数値を2項演算の第1項に登録し,入力中の数字を 0 にします.
- = キーは入力中の数字を2項演算の第 2 項に登録し,足し算を実行し,その結果を表示するとともに入力中の数字を 0 にします.
- 格子状のレイアウトを位置を指定して行う b1.grid(row=3,column=0)
- いくつかのコラムをまたがる指定も可能 e.grid(row=0,column=0,columnspan=4)
b1 = tk.Button(f,text='1', command=key(1)) #これはまちがい
と書いてしまうと関数key()
を引数 1 で呼び出した結果の「返り値」が代入され てしまい,関数key()
を引数 1 も指定して call-back 関数として呼び出してもら うことになりません.
ただ数値を代入するだけになってしまうということ?
関数
key1()
の定義と ボタン b1 の call-back 関数の指定を直接結びつけられると便利で key1 という名 前は不要になります. これを実現する記法として Python では lambda 表現 1というものがあり,その 場で関数名をつけずに関数を定義して,変数に代入する手法で,b1 の例ではb1 = tk.Button(f,text='1', command=lambda:key(1))
font=('Helvetica', 14)
文字フォントと大きさwidth=2
ウィジェットの大きさ (ボタンでは文字数)bg = '#ffffc0'
背景色の指定,RGB でそれぞれ 16 進数2桁Mac では現状 bg の設定で色が変わりません.bg の代わりに highlightbackground という引数を設定するとボタン自体の色は変わりませんがボタン周辺 の色が変わるため,演習時はこれで代用して下さい.
演習 9-1 Tkinter での加算電卓の作成 プログラム 9-1 もしくはプログラム 9-2 について実際にプログラムを作成し,動作を確認してください.
演習 9-2 ウィジェットの体裁の調整
- 足し算電卓のフォントサイズ,ウィジェットの色を以下のように設定してくだ さい.背景色を Frame は‘#ffffc0‘(薄黄色),数字キーは白,クリアキーは赤, +,=キーは緑にする.
- ボタンの大きさは2(文字分)にする.
- ボタンとエントリーのフォントとサイズは('Helvetica', 14)にする.
演習 9-3 電卓の四則演算への拡張(力試し) 足し算電卓を4則演算が可能なように拡張してください.ただし以下に留意する こと.
- ボタンの配置は適宜検討すること.
- 割り算は0で割るエラーが発生する可能性があるので,第2項の数値が0の 場合は何もしないか,エラーを表示する.
- 割り算の小数点以下は切り捨てる.Python で整数商を求める演算子は「//」 です. ヒント:プログラムの拡張作業は以下の2つになります.
- 四則演算を指定するためのボタンウィジェットの追加 (こちらはそれほど難しくないでしょう)
- 演算ボタンや「=」ボタンが押されたときのコールバック関数の設定 以下をヒントに考えてください.
- 電卓では+などの演算キーが押されたときにはその演算は行われず,=キ ーが押されたときに実行されます.このため,加減乗除の演算キーが押さ れたときには,どの演算を行うべきかを実行の際まで変数に記憶しておき ます.例えば operation という変数を設けて,加算なら 1, 減算なら 2, 乗算なら 3, 除算なら 4 などの値に設定します.
- =キーが押されたときに,記憶していた演算に応じて動作を変える必要が あります. 例えば以下のようになるでしょう.
if operation == 1: 加算を実行するブロック elif operation == 2: 減算を実行するブロック elif operation == 3:
演習 9-4 ウィジェットのリストでの管理(力試し) プログラム 9-1 やプログラム 9-2 では Button ウィジェットを数多く使います. これをリストの要素として扱うことを考えてください.またリストとして扱うこと で for 文を使った操作ができないかも考えてください. ただし,プログラム 9-2 の lambda 式(例えば command=lambda:key(1))では 関数 key(1) の引数 1 は数値として与えていますが,これを lambda 式の定義す るさいに変数(例えば i)の値を評価して書くことはできません.引数のある lambda 式の記法を使い,引数の暗黙知として以下のように与えます. command=lambda x = i:key(x)
演習 9-5 実際の電卓との差異 作成したプログラムと実際の電卓(や電卓アプリ)との動作の違いを探ってくだ さい.例えば = キーの代わりに + などの演算キーを押した場合の動作など.実際 の製品がしっかり設計されていることが分かると思います.
result
が更新されるだけで結果は表示されないtkinter を用いたアプリケーションでは mainloop() を呼び出すと,ユーザの操作 を待って,call back 関数を呼び出す無限ループになります.
- quit(): ループは脱出しますが,ウィンドウやウィジェットは残ります.
- destroy(): ループを脱出し,ウィンドウやウィジェットそのものをなくします.
9.1 本章の学習の目標
この章では tkinter を用いた GUI 型のアプリケーションの作成を通じて