tora-muscle / KURENAI_Python_Tutorial

https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/265459
0 stars 0 forks source link

9.Tkinter で作る GUI アプリケーション(1) #9

Open tora-muscle opened 1 year ago

tora-muscle commented 1 year ago

9.1 本章の学習の目標

この章では tkinter を用いた GUI 型のアプリケーションの作成を通じて

tora-muscle commented 1 year ago

9.2 GUI とイベント駆動型プログラミング

イベントが発生した際に行う処理の定義 このようなプログラミングをイベントに対する応答を主に記述することからイベ ント駆動型 (event-driven) プログラミングと呼びます.

tora-muscle commented 1 year ago

9.3 モデルとユーザーインターフェイスの分離

  • M: Model, アプリケーションの骨格を与える計算対象のモデル,基本的に GUI とは独立
  • V: View,Model で得られた結果をユーザに示すプログラム,GUI が担う
  • C: Control,モデルに対するユーザの操作のためのプログラム,GUI が担う
tora-muscle commented 1 year ago

9.4 tkinter

それぞれにウィ ンドウの描画などは異なった方法で行われます.これらの OS/ウィンドウ環境の差 異を吸収し,共通に使える GUI 用のフレームワークとして Tcl/Tk があります.

tora-muscle commented 1 year ago

9.5 tkinter の例題(tkdemo-2term.py)

以下のような加算のみの電卓を考えます.

  • 0~9の10キーと,C(クリア),+(足し算)=(計算) の 13 個のボタンと
  • 数値を示す1行の文字入出力で構成されます.
  • 0~9 は電卓と同様に入力中の数字の最小桁を挿入します.(入力中の数字を 10 倍して押されたキーの数字 を加える)
  • C は数値を0にします.
    • キーは入力された数値を2項演算の第1項に登録し,入力中の数字を 0 にします.
  • = キーは入力中の数字を2項演算の第 2 項に登録し,足し算を実行し,その結果を表示するとともに入力中の数字を 0 にします.

プログラム 9-1 加算のみの電卓作成

スクリーンショット 2023-10-30 21 18 48

tora-muscle commented 1 year ago

9.6 tkinter を用いたプログラムの基本構成

スクリーンショット 2023-10-30 21 23 24

tora-muscle commented 1 year ago

9.7 grid によるレイアウト

  • 格子状のレイアウトを位置を指定して行う b1.grid(row=3,column=0)
    • いくつかのコラムをまたがる指定も可能 e.grid(row=0,column=0,columnspan=4)
tora-muscle commented 1 year ago

9.8 lambda (λ)表現を使った Call Back 関数の記述

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))

tora-muscle commented 1 year ago

9.9 ウィジェットの体裁の調整

  • font=('Helvetica', 14) 文字フォントと大きさ
  • width=2 ウィジェットの大きさ (ボタンでは文字数)
  • bg = '#ffffc0' 背景色の指定,RGB でそれぞれ 16 進数2桁

Mac では現状 bg の設定で色が変わりません.bg の代わりに highlightbackground という引数を設定するとボタン自体の色は変わりませんがボタン周辺 の色が変わるため,演習時はこれで代用して下さい.

演習 9-1 Tkinter での加算電卓の作成 プログラム 9-1 もしくはプログラム 9-2 について実際にプログラムを作成し,動作を確認してください.

プログラム 9-1 加算のみの電卓作成

widget 定義を lambda 式を用いた定義に変更

https://github.com/k-saito-en/KURENAI_Python_Tutorial/assets/111550856/fa38fe90-823e-4e2c-a6ec-c9053ef8d9bf

演習 9-2 ウィジェットの体裁の調整

  • 足し算電卓のフォントサイズ,ウィジェットの色を以下のように設定してくだ さい.背景色を Frame は‘#ffffc0‘(薄黄色),数字キーは白,クリアキーは赤, +,=キーは緑にする.
  • ボタンの大きさは2(文字分)にする.
  • ボタンとエントリーのフォントとサイズは('Helvetica', 14)にする.

演習9-2

スクリーンショット 2023-10-31 11 18 15

演習 9-3 電卓の四則演算への拡張(力試し) 足し算電卓を4則演算が可能なように拡張してください.ただし以下に留意する こと.

  • ボタンの配置は適宜検討すること.
  • 割り算は0で割るエラーが発生する可能性があるので,第2項の数値が0の 場合は何もしないか,エラーを表示する.
  • 割り算の小数点以下は切り捨てる.Python で整数商を求める演算子は「//」 です. ヒント:プログラムの拡張作業は以下の2つになります.
  • 四則演算を指定するためのボタンウィジェットの追加 (こちらはそれほど難しくないでしょう)
  • 演算ボタンや「=」ボタンが押されたときのコールバック関数の設定 以下をヒントに考えてください.
    • 電卓では+などの演算キーが押されたときにはその演算は行われず,=キ ーが押されたときに実行されます.このため,加減乗除の演算キーが押さ れたときには,どの演算を行うべきかを実行の際まで変数に記憶しておき ます.例えば operation という変数を設けて,加算なら 1, 減算なら 2, 乗算なら 3, 除算なら 4 などの値に設定します.
    • =キーが押されたときに,記憶していた演算に応じて動作を変える必要が あります. 例えば以下のようになるでしょう.
      if operation == 1: 
        加算を実行するブロック
      elif operation == 2: 
        減算を実行するブロック
      elif operation == 3:

演習9-3

スクリーンショット 2023-10-31 11 51 34

演習 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-4

演習 9-5 実際の電卓との差異 作成したプログラムと実際の電卓(や電卓アプリ)との動作の違いを探ってくだ さい.例えば = キーの代わりに + などの演算キーを押した場合の動作など.実際 の製品がしっかり設計されていることが分かると思います.

tora-muscle commented 1 year ago

9.10 tkinter の終わり方

tkinter を用いたアプリケーションでは mainloop() を呼び出すと,ユーザの操作 を待って,call back 関数を呼び出す無限ループになります.

  • quit(): ループは脱出しますが,ウィンドウやウィジェットは残ります.
  • destroy(): ループを脱出し,ウィンドウやウィジェットそのものをなくします.
tora-muscle commented 1 year ago

9.11 Frame クラスを拡張する方式での実装法

プログラム9-3 Frame クラスを拡張する tkinter の実装法

プログラム9-3 に詳細コメントを追加