Excelは万能なので、商品金額をいくつか足し算したいだけでもExcelを起動することがあるだろう。しかし、業務でよく足し算するのなら専用ツールを作ってしまうと便利だ。本稿では、計算処理をしてメールに貼り付けするという一連の処理を自動化するツールを作ってみましょう。
汎用ツールと専用ツールを使い分けよう
Excelのような汎用表計算ツールに習熟しておけば、あらゆる計算処理をExcelだけで処理できる。世界中のオフィスでExcelが活躍しているのは、その高い汎用性と豊富な機能によるところが大きいだろう。 これに対して、簡単な専用ツールを自作するならば、汎用ツールを工夫して使うよりも、何倍も効率が良く、素早くタスクを完成させることができる。専用ツールは、特定のタスクに特化させるため、操作性がよく画面もシンプルで使い勝手の良いものとなる。
それで、今回は、入力した商品の金額を合計し、税込み金額を分かりやすく整形するというプログラムを作ってみよう。そして、整形済みのテキストをクリップボードにコピーしておいて、メールやLINEなどで手軽に返信できるようにしてみよう。
簡単にデスクトップアプリを作ろう
前回、手軽にGUIアプリを開発できるオープンソースのライブラリTkEasyGUIについて紹介したので、これを使ってみよう。ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、TkEasyGUIをインストールするために、下記のコマンドを実行しよう。
# Windowsの場合
python -m pip install TkEasyGUI
# macOS/Linuxの場合
python3 -m pip install TkEasyGUI
なお、本連載で前回紹介したコマンドを実行して、TkEasyGUIをインストールした場合はトラブルが起きるかもしれない。と言うのも、パッケージ名が微妙に変わったので一度古いバージョンを完全に削除する必要がある。詳しい手順をこちらで紹介したので参考にしよう。
TkEasyGUIの簡単な使い方
まずは、TkEasyGUIの簡単な使い方を紹介しよう。TkEasyGUIでは、画面レイアウトを二次元のリスト内に、作成したいボタン(eg.Button)やエディタ(eg.Input)などのGUI部品のオブジェクトを配置するだけでGUI画面を作成できるのが特徴だ。
簡単な例として、次のように説明文と3つのボタンを持つウィンドウを作成してみよう。ボタンを押すと、押したボタンに応じたメッセージが表示されるという簡単なプログラムだ。
このGUI画面を実現するのが以下のプログラムだ。「simple.py」という名前で保存しよう。
import TkEasyGUI as eg
# 画面レイアウトの定義 --- (*1)
layout = [
[eg.Text("好きな果物のボタンを押してください。")],
[eg.Button("リンゴ"), eg.Button("バナナ"), eg.Button("ミカン")]
]
# ウィンドウを表示 --- (*2)
with eg.Window("テスト", layout) as win:
# イベントが発生するたびに処理を行う --- (*3)
for event, values in win.event_iter():
# イベントに応じた処理を行う
if event == "バナナ":
eg.popup("バナナって美味しいですよね。")
if event in ["リンゴ", "ミカン"]:
eg.popup(f"果物と言えば、{event}ですよね。")
ターミナルで次のコマンドを入力すると実行できる。次のようなウィンドウが表示される。
# Windowsの場合
python simple.py
# macOS/Windowsの場合
python3 simple.py
プログラムを確認してみよう。(*1)では画面レイアウトを定義している。二次元のリストに対して、ラベル(eg.Text)とボタン(eg.Button)を指定している。そして、(*2)ではウィンドウを表示して、(*3)でイベントが発生するたびに、イベントに応じた処理を行うようにしている。
数字をカンマで3桁区切りにする簡単な方法
なお、今回のプログラムでは商品金額を合計するプログラムを作る。そこで使いたいのが、金額を3桁ごとのカンマで区切るという処理だ。プログラムを作る上で意外と使うのだが、毎回忘れてしまいがちなので、ここで確認しておこう。
price = 123456789
# [1] --- f-stringを使う方法 ---
print(f'{price:,}')
# [2] --- formatを使う方法 ---
print('{:,}'.format(price))
# [3] --- localeを使う方法 ---
import locale
# ロケールの設定(例: 日本の場合)
locale.setlocale(locale.LC_NUMERIC, 'ja_JP')
price_str = locale.format_string('%d', price, grouping=True)
print(price_str)
上記のプログラムを実行すると、いずれも「123,456,789」と出力を行う。f-stringを使う方法、formatを使う方法、locale.format_stringを使う方法の3つを紹介したが、f-stringが一番シンプルなので、今回はこれを利用してみよう。
金額の合計ツールを完成させよう
基本的な処理が確認できたので、今回作成するツールを作成しよう。ここでは次の処理を行うプログラムを作る。
(1) 複数の商品金額を入力する
(2) 金額を合計して、消費税を加えた税込み金額を計算する
(3) 計算結果を整形し、クリップボードにコピーする
この動作を行うGUIを持ったデスクトップアプリとして作成しよう。プログラムは次のようになる。プログラムを「sum_copy_tool.py」という名前で保存しよう。
import math
import TkEasyGUI as eg
TAX_RATE = 0.1 # 税率の指定(10%の場合)
def main():
# 画面レイアウトの定義 --- (*1)
layout = [
[eg.Text("1行に1件ずつ金額を入力してください")],
[eg.Multiline("100\n200", key="-input-", size=(50, 8), enable_events=True)],
[eg.Multiline("", key="-sum-", size=(30, 2), expand_x=True)],
[eg.Button("結果をコピー")]]
# ウィンドウを表示 --- (*2)
with eg.Window("合計ツール", layout, font=("", 16)) as win:
# イベントが発生するたびに処理を行う --- (*3)
for event, values in win.event_iter():
if event == "結果をコピー": # ボタンが押されたとき
copy_and_show_result(values)
elif event == "-input-": # Enterキーが押されたとき
calc_lines(win, values)
def copy_and_show_result(values):
# 計算の経過と結果を得る --- (*4)
lines = "見積もり金額をお知らせします:\n-----\n"
lines += " + ".join(values["-input-"].strip().split("\n"))
lines += "\n-----\n" + values["-sum-"]
# 結果をコピーして表示
eg.set_clipboard(lines) # クリップボードにコピー
eg.popup_scrolled(lines, size=(50, 10)) # ダイアログに表示
def calc_lines(win, values):
# 入力値を改行で区切って合計する --- (*5)
total = 0
for line in values["-input-"].split("\n"):
line = line.strip()
try:
total += float(line)
except ValueError:
pass
# 税額を計算
tax = math.ceil(total * TAX_RATE)
total_tax = total + tax
# 3桁区切りカンマを入れる --- (*6)
total_s = f"¥{int(total):,}"
tax_s = f"¥{math.ceil(total * TAX_RATE):,}"
total_tax_s = f"¥{int(total_tax):,}"
# 結果を表示 --- (*7)
result = f"小計 {total_s:>10}円 (外税額 {int(TAX_RATE*100)}% {tax_s}円)\n" + \
f"合計 {total_tax_s:>10}円"
win["-sum-"].set_text(result)
if __name__ == "__main__":
main()
プログラムを実行するには、以下のコマンドを実行しよう。
# Windowsの場合
python sum_copy_tool.py
# macOS/Linuxの場合
python3 sum_copy_tool.py
プログラムを確認してみよう。(*1)では、今回作成するGUI画面のレイアウトを定義する。複数行の入力が可能なテキストエディタを配置するには、eg.Multilineを使う。それぞれkey引数を指定することで、手軽に操作できるようになる。