使用 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_liftedGUI 版中的对应方法几乎一致(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_lifted、reps_performed初始化为 0 | L6-L11 |
get_user_input | 通过input()采集重量与次数 | L13-L18 |
calculate_one_rep_max | 代入 Epley 公式计算并返回 1RM | L20-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):
- 提示标签:"Enter the weight you lifted (in kg):";
- 重量输入框
weight_entry; - 提示标签:"Enter the number of reps you performed:";
- 次数输入框
rep_entry; - 计算按钮 "Calculate",绑定
display_result回调; - 结果标签与用于显示数值的
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.py | one_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 两种前端下的迁移方式。
使用注意事项与已知局限
结合源码实现,以下几点需要使用者留意:
- 输入类型限制:两版均用
int()强制转换输入。从源码可以推断,若输入非整数(如小数或字母),会直接抛出ValueError,程序未做异常捕获与重试提示。 - 单位约定:程序提示重量单位为 kg,但公式本身与单位无关,换成磅(lb)结果同样成立,只是输出标签仍写死为 "kg",跨单位使用时需自行换算。
- 估算而非实测:1RM 是经验公式推算值,不同公式(如 Brzycki、Lombardi 等)结果略有差异,Epley 在中等次数范围内(约 1–10 次)表现稳定。README 的 References 一节提供了该公式的学术出处与延伸阅读材料。
- 重复次数上限:次数越高,估算误差通常越大,建议将程序用于 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),仅供参考