使用 Epley 公式估算 1RM:One-Rep Max Calculator 命令行版与 Tkinter GUI 版源码解析
2026/9/19 22:36:09 网站建设 项目流程

使用 Epley 公式估算 1RM:One-Rep Max Calculator 命令行版与 Tkinter GUI 版源码解析

【免费下载链接】PythonMy Python Examples项目地址: https://gitcode.com/gh_mirrors/py/Python

导读

本文围绕仓库 nitkarshchourasia/to_sort/one_rep_max_calculator 目录下的 One-Rep Max Calculator 项目展开,剖析其基于Epley 公式估算举重动作 1 次最大重复重量(1RM)的实现方式。项目提供两个版本:命令行交互版 one_rep_max_calculator.py 与 Tkinter 图形界面版 one_rep_max_calculator_gui.py。读完本文,你将掌握 1RM 估算的数学原理、Epley 公式的 Python 落地写法,以及同一算法如何在纯终端与桌面 GUI 两种形态下复用。

1RM 是什么,为什么需要估算

1RM(One-Repetition Maximum,单次最大重复重量)指某个举重动作中,你以标准动作只能完成 1 次的极限重量。它是衡量力量水平最直观的指标,常用于:

  • 跟踪一段训练周期内的力量增长;
  • 为后续训练计划设定负荷百分比(如 70% 1RM、85% 1RM);
  • 在不冒实际冲击极限重量风险的前提下评估力量。

直接实测 1RM 存在受伤风险,因此实践中普遍采用公式估算:记录一组较轻的重量与可重复次数,代入经验公式推算 1RM。这正是本项目两个程序的核心用途。

Epley 公式:一行的核心算法

本项目两个版本均采用Epley 公式,其原始出处为 README「References」一节所列文献:Epley, B.Poundage chart. In: Boyd Epley Workout. Lincoln, NE: Body Enterprises, 1985. p. 23。

Epley 公式的标准形式为:

1RM = 重量 × (1 + 次数 × 0.0333)

即:1RM = weight × reps × 0.0333 + weight。其中 0.0333 是 1/30 的近似值,含义是"每多完成 1 次重复,重量大约可上浮 3.33% 用于估算 1RM"。

在命令行版源码中,该公式被封装为类方法(one_rep_max_calculator.py#L20-L24):

def calculate_one_rep_max(self): """ Calculates the one-rep max based on the Epley formula. """ return (self.weight_lifted * self.reps_performed * 0.0333) + self.weight_lifted

GUI 版中的对应方法几乎一致(one_rep_max_calculator_gui.py#L50-L54):

def calculate_1rm(self): """Calculates and returns the estimated 1RM.""" weight = int(self.weight_entry.get()) reps = int(self.rep_entry.get()) return (weight * reps * 0.0333) + weight

两处实现完全等价,体现了"算法逻辑与界面形态解耦"的良好实践:核心公式只需一行,CLI 与 GUI 各自负责输入采集与结果展示。

命令行版本:one_rep_max_calculator.py

运行环境与启动方式

按 README 说明,命令行版只需Python 3即可运行,无需任何第三方依赖。在仓库根目录执行:

python nitkarshchourasia/to_sort/one_rep_max_calculator/one_rep_max_calculator.py

程序启动后会依次在终端提示输入,全部为纯标准库交互。

源码结构拆解

整个程序围绕单个类OneRepMaxCalculator组织(one_rep_max_calculator.py#L1-L31),职责划分清晰:

方法职责对应源码行
__init__weight_liftedreps_performed初始化为 0L6-L11
get_user_input通过input()采集重量与次数L13-L18
calculate_one_rep_max代入 Epley 公式计算并返回 1RML20-L24
display_one_rep_max格式化输出估算结果L26-L31

输入采集使用了int(input(...))强制转换为整数:

self.weight_lifted = int(input("Enter the weight you lifted (in kg): ")) self.reps_performed = int(input("Enter the number of reps you performed: "))

入口采用标准if __name__ == "__main__":守卫(L44-L45),调用main()依次执行"创建实例 → 获取输入 → 计算并展示"三步流程(L34-L41):

def main(): calculator = OneRepMaxCalculator() calculator.get_user_input() calculator.display_one_rep_max()

这种"初始化—输入—计算—展示"的线性流程非常适合作为初学者理解面向对象封装的入门范例。

一次完整的运行示例

假设你卧推 60 kg 完成了 10 次,运行效果如下:

Enter the weight you lifted (in kg): 60 Enter the number of reps you performed: 10 Your estimated one-rep max (1RM) is: 79.98 kg

验算:60 × 10 × 0.0333 + 60 = 79.98,即按 Epley 公式,该表现对应的 1RM 约为 80 kg。

Tkinter 图形界面版:one_rep_max_calculator_gui.py

运行环境与启动方式

GUI 版同样基于 Python 3,额外依赖标准库中的Tkinter(一般随 Python 官方安装包自带,无需单独 pip 安装)。启动命令:

python nitkarshchourasia/to_sort/one_rep_max_calculator/one_rep_max_calculator_gui.py

界面布局与交互逻辑

程序创建一个标题为 "One-Rep Max Calculator"、尺寸300x150的主窗口(L31-L33),自上而下依次放置(L36-L48):

  1. 提示标签:"Enter the weight you lifted (in kg):";
  2. 重量输入框weight_entry
  3. 提示标签:"Enter the number of reps you performed:";
  4. 次数输入框rep_entry
  5. 计算按钮 "Calculate",绑定display_result回调;
  6. 结果标签与用于显示数值的result_value_label

控件全部采用pack()几何管理器按顺序纵向排布,代码直观易读。

交互回调机制

用户点击按钮后,Tkinter 触发display_result(L56-L59):

def display_result(self): """Calculates the 1RM and updates result_value_label with it.""" one_rep_max = self.calculate_1rm() self.result_value_label.config(text=f"{one_rep_max} kg")

它从两个Entry控件取值、调用calculate_1rm()完成 Epley 公式计算,再用config(text=...)动态更新标签文本——这是 Tkinter 应用中"读取输入 → 计算 → 更新界面"最典型的回调写法。

事件循环由run()方法启动(L61-L63):

def run(self): """Runs the Tkinter event loop.""" self.window.mainloop()

入口同样使用if __name__ == "__main__":守卫(L67-L69),实例化后直接进入mainloop()

源码注释中的改进方向

值得注意的是,源码末尾保留了一组面向未来的 TODO 注释(L71-L75),包括:放大字体、使用更好的文本格式、引入深色模式并支持深浅色主题切换。这些注释为读者指明了可以自行练习的扩展点,是学习 Tkinter 样式定制与主题切换的良好素材。

命令行版与 GUI 版对比

维度命令行版GUI 版
文件one_rep_max_calculator.pyone_rep_max_calculator_gui.py
依赖仅 Python 3 标准库Python 3 + Tkinter
输入方式终端input()提示Entry输入框 + 按钮点击
输出方式终端print()文本窗口内Label实时更新
核心算法(w * r * 0.0333) + w(w * r * 0.0333) + w(一致)
适用场景脚本化、管道、无头环境交互式桌面使用

两个版本共享完全相同的 Epley 公式实现,只是"壳"不同——这恰好演示了同一业务逻辑在 CLI 与 GUI 两种前端下的迁移方式。

使用注意事项与已知局限

结合源码实现,以下几点需要使用者留意:

  1. 输入类型限制:两版均用int()强制转换输入。从源码可以推断,若输入非整数(如小数或字母),会直接抛出ValueError,程序未做异常捕获与重试提示。
  2. 单位约定:程序提示重量单位为 kg,但公式本身与单位无关,换成磅(lb)结果同样成立,只是输出标签仍写死为 "kg",跨单位使用时需自行换算。
  3. 估算而非实测:1RM 是经验公式推算值,不同公式(如 Brzycki、Lombardi 等)结果略有差异,Epley 在中等次数范围内(约 1–10 次)表现稳定。README 的 References 一节提供了该公式的学术出处与延伸阅读材料。
  4. 重复次数上限:次数越高,估算误差通常越大,建议将程序用于 10 次以内的高质量组记录。

在仓库中的位置与延伸阅读

本项目位于 nitkarshchourasia/to_sort/one_rep_max_calculator/ 目录,归属于仓库中nitkarshchourasia作者的to_sort(待整理)子目录。仓库根目录 README.md 将其定位为"减少人工负担的脚本集合与 Python 入门教学示例",本项目正是其中面向健身场景的小型实用工具范例。

若要进一步深入,可以:

  • 阅读 one_rep_max_calculator.py 全文,体会面向对象封装的四个方法如何各司其职;
  • 对照 one_rep_max_calculator_gui.py 全文,学习 Tkinter 控件的创建、pack布局与command回调绑定;
  • 结合源码末尾的注释,尝试自行扩展深色模式、更大字体等 GUI 增强功能。

【免费下载链接】PythonMy Python Examples项目地址: https://gitcode.com/gh_mirrors/py/Python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询