目录
环境的配置
需要使用到的库(Python自带,无需安装新的库):
import tkinter as tk
功能的描述
使用Python编写的基于Tkinter库的图形用户界面(GUI)程序,其主要功能是实现一个复利计算工具。用户可以通过这个工具输入本金、年化利率、每月追加本金以及投资年数,然后程序会计算并展示每年的投资总金额和每年的总利息。
代码内容
运行逻辑
-
初始化界面:程序首先创建了一个主窗口,并设置了窗口的标题、大小以及不可调整大小的属性。同时,定义了字体大小和一些默认的输入值。
-
创建控件:程序创建了多个控件,包括标签、输入框和按钮。每个控件都通过
place
方法放置在窗口的指定位置。- 标签用于显示需要输入的信息,如“本金(元)”、“每月追加本金(元)”、“年化利率(%)”和“年数”。
- 输入框允许用户输入相应的数值,每个输入框都预设了默认值。
- 按钮用于触发计算过程。
-
计算逻辑:当用户点击“计算”按钮时,程序会调用
calculate
函数。- 首先,程序从输入框中获取用户输入的本金、年化利率、每月追加本金和投资年数,并将它们转换为相应的数据类型(浮点数或整数)。
- 然后,程序初始化总本金和利息变量,并清空结果文本框。
- 接下来,程序进入一个循环,模拟每天的复利过程。在每一天结束时,计算当天的利息并将其加到本金上。
- 每月底,程序会将每月追加的本金加到总本金上,并输出每月的总金额。
- 每年底,程序会将当年的总金额和总利息输出到结果文本框中,并禁用文本框的写入状态以防止重复写入。
-
输出结果:计算完成后,用户可以在结果文本框中看到每年的投资总金额和每年的总利息。这些信息以文本形式展示,便于用户查看和理解。
完整代码
import tkinter as tk
# 定义计算函数
def calculate():
principal = float(principal_entry.get()) # 获取输入的本金金额并转为浮点数
annual_rate = float(rate_entry.get()) # 获取输入的年化利率并转为浮点数
monthly_addition = float(addition_entry.get()) # 获取输入的每月追加本金并转为浮点数
years = int(years_entry.get()) # 获取输入的年数并转为整数
total_principal = principal # 总本金初始值等于本金
time = 0
interest1 = 0
result_text.delete(1.0, tk.END) # 清空结果文本框
while time < 365 * years: # 在年数范围内循环
time += 1 # 时间加一天
rate_per_day = annual_rate / 365 / 100 # 计算每天的利率
interest = principal * rate_per_day # 计算当天的利息
principal += interest # 计算当天的本金总额
interest1 = interest1 + interest # 计算本年度总利息
if time % 30 == 0: # 如果是一个月的最后一天
principal += monthly_addition # 加上每月追加的本金
total_principal += monthly_addition # 总本金也要加上每月追加的部分
print(f"第{time//30}个月总金额:{principal:.2f}元") # 输出每月总金额
if time % 365 == 0: # 如果是一年的最后一天
result_text.config(state=tk.NORMAL) # 开启结果文本框写入状态
result_text.insert(tk.END, f"第{time//365}年总金额:{principal/10000:.2f}万元,当年总利息为{interest1:.1f}元\n")
result_text.config(state=tk.DISABLED) # 关闭结果文本框写入状态
interest1 = 0
# 创建主窗口
root = tk.Tk()
root.title("复利计算工具")
window_width = 600
window_height = 450
root.geometry(f"{window_width}x{window_height}")
font_size = 14
root.resizable(False, False) # 设置窗口大小不可调整
# 创建标签、输入框和按钮等控件
principal_label = tk.Label(root, text="本金(元):", font=("楷体", font_size))
principal_label.place(x=40, y=10)
principal_entry = tk.Entry(root)
principal_default_value = "30000"
principal_entry.insert(0, principal_default_value) # 设置默认值
principal_entry.place(x=210, y=10)
addition_label = tk.Label(root, text="每月追加本金(元):", font=("楷体", font_size))
addition_label.place(x=40, y=40)
addition_entry = tk.Entry(root)
default_addition_value = "5000"
addition_entry.insert(0, default_addition_value) # 设置默认值
addition_entry.place(x=210, y=40)
rate_label = tk.Label(root, text="年化利率(%):", font=("楷体", font_size))
rate_label.place(x=40, y=70)
rate_entry = tk.Entry(root)
default_rate_value = "5"
rate_entry.insert(0, default_rate_value) # 设置默认值
rate_entry.place(x=210, y=70)
years_label = tk.Label(root, text="年数:", font=("楷体", font_size))
years_label.place(x=40, y=100)
years_entry = tk.Entry(root)
default_years_value = "2"
years_entry.insert(0, default_years_value) # 设置默认值
years_entry.place(x=210, y=100)
calculate_button = tk.Button(root, text="计算", font=("楷体", font_size), command=calculate)
calculate_button.place(x=400, y=90)
result_text = tk.Text(root, height=16, width=50, font=("楷体", font_size))
result_text.place(x=40, y=130)
root.mainloop()
运行结果
exe文件
已打包完成exe文件上传:python写的复利计算小程序资源-CSDN文库
打包方法:在Vscode中将python打包为exe,超级简单,还能自定义exe的logo-CSDN博客
-------------------------------------------------------------------------------------------------------------------------------
程序的迭代
更新:2024/03/28
打开exe文件时发现启动的太慢了。故优化程序。
这个程序将在一个新线程中创建GUI界面,并在另一个线程中执行计算任务,以避免在打开程序时或计算过程中出现延迟。
import tkinter as tk
from threading import Thread
# 定义计算函数
def calculate(result_text_widget, principal_entry, rate_entry, addition_entry, years_entry):
principal = float(principal_entry.get()) # 获取输入的本金金额并转为浮点数
annual_rate = float(rate_entry.get()) / 100.0 # 获取输入的年化利率并转为小数形式
monthly_addition = float(addition_entry.get()) # 获取输入的每月追加本金并转为浮点数
years = int(years_entry.get()) # 获取输入的年数并转为整数
total_principal = principal # 总本金初始值等于本金
time = 0
interest1 = 0
result_text_widget.delete(1.0, tk.END) # 清空结果文本框
while time < 365 * years: # 在年数范围内循环
time += 1 # 时间加一天
rate_per_day = annual_rate / 365 # 计算每天的利率
interest = total_principal * rate_per_day # 计算当天的利息
total_principal += interest # 计算当天的本金总额
interest1 += interest # 计算本年度总利息
if time % 30 == 0: # 如果是一个月的最后一天
total_principal += monthly_addition # 加上每月追加的本金
if time % 365 == 0: # 如果是一年的最后一天
result_text_widget.config(state=tk.NORMAL) # 开启结果文本框写入状态
result_text_widget.insert(tk.END, f"第{time//365}年总金额:{total_principal/10000:.2f}万元,当年总利息为{interest1:.1f}元\n")
result_text_widget.config(state=tk.DISABLED) # 关闭结果文本框写入状态
interest1 = 0
# 定义GUI界面创建函数
def create_gui():
# 创建主窗口
root = tk.Tk()
root.title("复利计算工具")
root.geometry("600x450")
root.resizable(False, False)
# 创建标签、输入框和按钮等控件
principal_label = tk.Label(root, text="本金(元):", font=("楷体", 14))
principal_label.place(x=40, y=10)
principal_entry = tk.Entry(root, width=20, font=("楷体", 14))
principal_entry.insert(0, "30000")
principal_entry.place(x=210, y=10)
rate_label = tk.Label(root, text="年化利率(%):", font=("楷体", 14))
rate_label.place(x=40, y=70)
rate_entry = tk.Entry(root, width=20, font=("楷体", 14))
rate_entry.insert(0, "5")
rate_entry.place(x=210, y=70)
addition_label = tk.Label(root, text="每月追加本金(元):", font=("楷体", 14))
addition_label.place(x=40, y=40)
addition_entry = tk.Entry(root, width=20, font=("楷体", 14))
addition_entry.insert(0, "5000")
addition_entry.place(x=210, y=40)
years_label = tk.Label(root, text="年数:", font=("楷体", 14))
years_label.place(x=40, y=100)
years_entry = tk.Entry(root, width=20, font=("楷体", 14))
years_entry.insert(0, "2")
years_entry.place(x=210, y=100)
result_text = tk.Text(root, height=16, width=50, font=("楷体", 14))
result_text.place(x=40, y=130)
result_text.config(state=tk.DISABLED)
calculate_button = tk.Button(root, text="计算", font=("楷体", 14), command=lambda: Thread(target=calculate, args=(result_text, principal_entry, rate_entry, addition_entry, years_entry)).start())
calculate_button.place(x=420, y=90)
root.mainloop()
# 启动GUI界面
if __name__ == "__main__":
gui_thread = Thread(target=create_gui)
gui_thread.start()