■面積変換アプリの仕様
・面積をテキストボックスに入力する。
・変換前の単位をプルダウンメニューで表示&設定する。
・変換ボタン押下時、変換前の単位以外の単位について、面積の変換を行う。
・面積の変換後、TreeViewに変換結果一覧を表示する。
なお、計算処理は以下の表を元に算出する。
■使用するライブラリ
▼tkinter
メインフレームなど、GUI画面全般に使用
▼tkinter.ttk
TreeViewおよびCombobox(プルダウン)を表示するために使用
▼tkinter.messagebox
メッセージボックス出力に使用
▼numpy
配列にデータを格納するために使用
■サンプルコード
# -*- Coding:UTF-8 -*-
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.messagebox as msg
import numpy as np
###########################################
# 処理名 :データ初期化処理
# 処理内容 :Treeviewに出力した値を全て削除
###########################################
def DataInitialization():
tree.delete(*tree.get_children())
###########################################
# 処理名 :変換処理
###########################################
def ChangeUnit(change_list, float_bf_area):
# 戻り値(計算処理結果配列)の宣言
list_af_area = []
# 変換処理用配列の値をループ処理
for i in range(len(change_list)):
# 0なら掛け算
if change_list[i][0] == 0:
list_af_area.append(round(float_bf_area * change_list[i][1], 5))
# 1なら割り算
elif change_list[i][0] == 1:
list_af_area.append(round(float_bf_area / change_list[i][1], 5))
return list_af_area
###########################################
# 処理名 :データ反映処理
# 処理内容 :入力した面積・単位を元に変換処理を行う
###########################################
def ChangeArea():
# 入力値を変数に格納
float_bf_area = float(str_bf_area.get())
# 単位のインデックスを格納
# 0:㎡, 1:a, 2:ha, 3:坪, 4:畝, 5:反, 6:町歩
unit_bf_area = select_bf_area.current()
# 0:㎡
if unit_bf_area == 0:
# ㎡以外の単位を配列に格納(Treeview表示用)
unit_list = ["a", "ha", "坪", "畝", "反", "町歩"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listM2 = np.array([[0, 0.01], [0, 0.0001], [0, 0.33],
[1, 666], [1, 999], [1, 9999]])
# 「㎡」変換処理
list_af_area = ChangeUnit(change_listM2, float_bf_area)
# 1:a
elif unit_bf_area == 1:
# a以外の単位を配列に格納(Treeview表示用)
unit_list = ["㎡", "ha", "坪", "畝", "反", "町歩"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listA = np.array([[0, 100], [1, 100], [0, 30],
[1, 6.6], [1, 9.9], [1, 99]])
# 「a」変換処理
list_af_area = ChangeUnit(change_listA, float_bf_area)
# 2:ha
elif unit_bf_area == 2:
# ha以外の単位を配列に格納(Treeview表示用)
unit_list = ["㎡", "a", "坪", "畝", "反", "町歩"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listHa = np.array([[0, 10000], [0, 100], [0, 3000],
[1, 16], [1, 0.1], [1, 0.01]])
# 「ha」変換処理
list_af_area = ChangeUnit(change_listHa, float_bf_area)
# 3:坪
elif unit_bf_area == 3:
# 坪以外の単位を配列に格納(Treeview表示用)
unit_list = ["㎡", "a", "ha", "畝", "反", "町歩"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listTsubo = np.array([[0, 3.3], [1, 30], [1, 3000],
[1, 200], [1, 300], [1, 3000]])
# 「坪」変換処理
list_af_area = ChangeUnit(change_listTsubo, float_bf_area)
# 4:畝
elif unit_bf_area == 4:
# 畝以外の単位を配列に格納(Treeview表示用)
unit_list = ["㎡", "a", "ha", "坪", "反", "町歩"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listUne = np.array([[0, 666], [0, 6.6], [0, 16],
[0, 200], [0, 0.66], [0, 0.067]])
# 「畝」変換処理
list_af_area = ChangeUnit(change_listUne, float_bf_area)
# 5:反
elif unit_bf_area == 5:
# 反以外の単位を配列に格納(Treeview表示用)
unit_list = ["㎡", "a", "ha", "坪", "畝", "町歩"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listTan = np.array([[0, 999], [0, 9.99], [0, 0.099],
[0, 300], [0, 1.67], [0, 0.1]])
# 「反」変換処理
list_af_area = ChangeUnit(change_listTan, float_bf_area)
# 6:町歩
elif unit_bf_area == 6:
# 町歩以外の単位を配列に格納(Treeview表示用)
unit_list = ["㎡", "a", "ha", "坪", "畝", "反"]
# 変換処理用配列に値を格納(「0:掛け算、1:割り算」、「計算値」)
change_listTyobu = np.array([[0, 9999], [0, 99.99], [0, 0.99],
[0, 3000], [0, 16.7], [0, 10]])
# 「町歩」変換処理
list_af_area = ChangeUnit(change_listTyobu, float_bf_area)
# ツリーに変換結果を反映
for i in range(len(list_af_area)):
tree.insert("", "end", values=(list_af_area[i], unit_list[i]))
###########################################
# 処理名 :変換ボタン押下処理
# 処理内容 :
# 1.データを初期化する
# 2.面積を変換する
###########################################
def Click_Henkan_Btn():
try:
# データ初期化処理
DataInitialization()
# データ変換処理
ChangeArea()
except:
msg.showinfo("エラー", "想定外のエラーが発生しました")
###########################################
# Tkinterの画面設定
###########################################
# ウィンドウの設定
base = tk.Tk()
base.title("面積変換")
canvas = tk.Canvas(base, width=300, height=300, bd=0, highlightthickness=0)
canvas.pack()
#入力値を保持
str_bf_area = tk.StringVar()
# 変換前面積ラベル
l_bf_area = tk.Label(base, text="面積", font=("",20))
l_bf_area.place(x=20, y=20)
# 変換前面積テキストボックス
txtbox_bf_area = tk.Entry(base, width=10, textvariable=str_bf_area)
txtbox_bf_area.place(x=70, y=20)
# プルダウンの設定
select_bf_area = ttk.Combobox(base, width=5, justify='center', state='readonly')
select_bf_area["values"] = ("㎡", "a", "ha", "坪", "畝", "反", "町歩")
select_bf_area.current(0)
select_bf_area.place(x=180, y=22)
# 変換ボタン関係の設定
btn_seldata = tk.Button(base, text="変換", command=Click_Henkan_Btn)
btn_seldata.place(x=140, y=50)
# Treeviewの設定
tree = ttk.Treeview(base, height=10, columns=(0, 1))
tree["show"] = "headings"
tree.column(0, width=100)
tree.column(1, width=100)
tree.heading(0, text='面積')
tree.heading(1, text='単位')
tree.place(x=50, y=75)
# ウィンドウの維持
base.mainloop()
■実行結果
▼㎡変換結果
▼a 変換結果
▼ha 変換結果
▼坪変換結果
▼畝変換結果
▼反変換結果
▼町歩変換結果
コメント