
Pythonデスクトップアプリのための勉強4日目です。
今回は、例外について学んだので、少し無理矢理ですが例外が発生しても処理が止まらないように実装していきます。
はい、ただ例外処理をしてみたかっただけですww
そもそも、Python でコードを書いていると様々なエラーが出ますが、下記の2種類に分けられます。
- 構文エラー
- 例外
構文エラーは、文法的に間違っているもので、プログラムは動作しないですが、例外は、文法的には正しいが、実行時にエラーが出るものです。
どういうことかというと、
1 |
print(10/0) |
これは、数学においてタブーですね。その時にZeroDivisionErrorという例外が発生します。
1 2 |
name = "Tanaka" print(name/100") |
これは、文字列は数字では割れませんので、型エラーという意であるTypeErrorが発生します。
そこで、
今回追加した機能は、try-except-else文による「例外処理」です。冒頭で説明した通り、少し無理矢理ですが身長と、体重に数値以外が入力されたら例外を出して、警告文を出す、という感じです。
- 70~89行目、try-except-else文で例外処理
try-except-else文
1 2 3 4 5 6 7 8 |
try: 例外が発生する可能性があるが、実行させたい処理 except エラー名: 例外発生時に行う処理 else: 例外が発生しない場合のみ、実行させたい処理 |
こんな感じです。
あと、警告文を出す際に、「身長」と「体重」のどちらが例外が発生しているのかを知るためにif文を使って、数値が入っているか判定しています。その際に、Pythonの組み込み型文字列メソッドを使用しています。
いくつかあるようですが、ここでは
文字列.isnumeric()
を使って判定しています。数値ならTrueが返されます。
以下がコードとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# Tkinterのライブラリを取り込む --- (*1) import tkinter as tk from tkinter import messagebox as mbox import tkinter.ttk as ttk # ウィンドウを作成 --- (*2) win = tk.Tk() win.title("BMI") # タイトル win.geometry("300x300") # サイズ # 名前を作成 # ラベルを作成 labelName = tk.Label(win, text='名前は?') # packで作成した部品をウィンドウ上に配置できる labelName.pack() # テキスト入力ボックスを作成 textName = tk.Entry(win) textName.pack() # insertで初期値を指定できる textName.insert(tk.END, '田中') # 年齢 # 名前と同じ流れで作成 labelAge = tk.Label(win, text="年齢は?") labelAge.pack() textAge = tk.Entry(win) textAge.pack() textAge.insert(tk.END, 23) # 性別 labelSex = tk.Label(win, text="性別") labelSex.pack() # コンボボックス作成(winに配置, リストの値を読み取り専用に設定) combo = ttk.Combobox(win, state="readonly", width=2) # リストの値を設定 combo["values"] = ("男", "女") combo.pack() # 身長を作成 labelHeight = tk.Label(win, text="身長は?") labelHeight.pack() textHeight = tk.Entry(win) textHeight.pack() # textHeight.insert(tk.END, 'cm単位で記入') textHeight.insert(tk.END, "aiueo") # 体重を作成 # 名前と同じ流れで作成 labelWeight = tk.Label(win, text="体重は?") labelWeight.pack() textWeight = tk.Entry(win) textWeight.pack() # textWeight.insert(tk.END, 'Kg単位で記入') textWeight.insert(tk.END, 66) # OKボタンを押した時 --- (*3) # 変数okButtonの引数であるcommandに関数名を記述し、その後の処理を書く def ok_click(): # 男か女で場合分け、comboの内容を得る sex = combo.get() if sex=="男": right_bmi = 22 elif sex=="女": right_bmi = 21 # テキストボックスの内容を得る name = textName.get() try: height = float(textHeight.get())/100 weight = float(textWeight.get()) except ValueError: if str(textHeight.get()).isnumeric() == False: mbox.showinfo("警告","身長 : 数値を入力してください") if str(textWeight.get()).isnumeric() == False: mbox.showinfo("警告","体重 : 数値を入力してください") else: print("例外は発生しませんでした") right_weight = (height)**2*right_bmi per = int(weight / right_weight * 100) - 100 #少数第3位を四捨五入 BMI = round(weight/(height*height), 2) # right_BMI = right_bmi # ダイアログを表示 mbox.showinfo("BMI", "貴方のBMIは{}".format(BMI)+"\n{0}性の標準BMIは{1}です".format(sex, right_bmi) +"\n貴方の肥満度は{}%".format(per)) # ボタンを作成 --- (*4) okButton = tk.Button(win, text='OK', command=ok_click) okButton.pack() # ウィンドウを動かす --- (*3) win.mainloop() |
コメント