「Pythonでデスクトップアプリを作ろう 前編」 その16
# -*- coding: utf-8 -*-"""Created on Sun Mar 12 12:44:46 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その16# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)## 割り勘計算機の機能 # ①1円や10円単位の集金が発生しないようにする。(細かい金額は幹事の支払いとする)# ②偉い人は多めの金額(新人の3倍)、平社員は新人の2倍の金額とし、新人は少なめ# の金額になるようにする。# ③金額によっては、幹事は平社員よりも支払い金額が少し安くなるようにする。# (安くなった分を、幹事の支払い分で調整する。)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト3●「warikan.py」# 「割り勘計算機」のプログラム # GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「tkinter.ttk」モジュールを、「ttk」という名前でインポートする。import tkinter.ttk as ttk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「math」モジュールをインポートする。import math# 計算結果を表示する関数def calculation_result(): t = int(total.get()) e = int(erai.get()) h = int(hira.get()) s = int(shin.get()) kanj = 2 base = math.floor(t / (e * 3 + h * 2 + s +kanj)) mErai = 0 if e == 0 else (math.ceil(base*3/100) * 100) mHira = 0 if h == 0 else (math.ceil(base*2/100) * 100) mShin = 0 if s == 0 else (math.ceil(base*1/100) * 100) mKanj = base * kanj total2 = mErai * e + mHira * h + mShin * s + mKanj mKanj = mKanj - (total2 - t) c = [['偉い人は :', str(mErai)], ['平社員は :', str(mHira)], ['新人は :', str(mShin)], ['幹事は :', str(mKanj)], ] for i in range(len(out_label)): out_label[i][0]['text'] = c[i][0] out_label[i][1]['text'] = c[i][1] # 計算結果画面へ切り替え out_frame.tkraise() # 入力画面への切り替え用の関数def change_in(): in_frame.tkraise()# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「割り勘計算機」にする。root.title('割り勘計算機')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x220')は、横サイズ=300ピクセル、縦サイズ=220ピクセルを表しているroot.geometry('300x220')# 各列の割合を指定root.columnconfigure(0, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)# 「入力画面用」フレーム(frame)の生成と配置in_frame = tk.Frame(root)in_frame.grid(column=0, row=0, sticky=tk.NSEW)# 「Entryウイジェット」の生成total = tk.Entry(in_frame, width=10)# 「Label」イジェットの生成s = ('金 額( 円 )', '偉い人(人数)', '平社員(人数)', '新 人(人数)', '幹 事(1人)')in_label = []for i in range(len(s)): in_label.append(tk.Label(in_frame, text=s[i])) # 「Combobox」ウィジェットの生成number = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10')erai = ttk.Combobox(in_frame, values=number, width=8)erai.current(0)hira = ttk.Combobox(in_frame, values=number, width=8)hira.current(0)shin = ttk.Combobox(in_frame, values=number, width=8)shin.current(0)# 「Button」ウイジェットの生成button = tk.Button(in_frame, text='計算', command=calculation_result)for i in range(2): in_frame.columnconfigure(i, weight=1)for i in range(6): in_frame.rowconfigure(i, weight=1) # 「grid」関数で配置in_label[0].grid(column=0, row=0)total.grid(column=1, row=0)in_label[1].grid(column=0, row=1)erai.grid(column=1, row=1)in_label[2].grid(column=0, row=2)hira.grid(column=1, row=2)in_label[3].grid(column=0, row=3)shin.grid(column=1, row=3)in_label[4].grid(column=0, row=4)button.grid(column=1, row=5)# 計算結果画面用フレームの生成と配置 out_frame = tk.Frame(root)out_frame.grid(column=0, row=0, sticky=tk.NSEW)out_frame.columnconfigure(0, weight=1)out_frame.columnconfigure(1, weight=1)for i in range(5): out_frame.rowconfigure(i, weight=1) # 「Label」ウイジェットの生成out_label = []for i in range(4): out_label.append([tk.Label(out_frame, padx=20), tk.Label(out_frame, padx=20)]) # 「Button」ウイジェットの生成button = tk.Button(out_frame, text='計算に戻る', command=change_in)for i in range(len(out_label)): out_label[i][0].grid(column=0, row=i, sticky=tk.E) out_label[i][1].grid(column=1, row=i, sticky=tk.W) button.grid(column=0, row=4, columnspan=2, sticky=tk.N)# 「frame」を前面にするin_frame.tkraise()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3●「warikan.py」は、ここまでリスト3●「warikan.py」の実行結果(その1)リスト3●「warikan.py」の実行結果(その1)