背景
抖音刷到:乙醇 > 乙醇脱氢酶 > 乙醛(一级致癌物) > 乙醛脱氢酶 > 乙酸
人晕不晕的是大脑反应 这个可以“练习”
但是出去挥发、尿液排除的,大都是在肝脏代谢,这个不可以”练习“
能喝多少酒 和体重 和基因 有关系
基因我没测 只能看看卫生组织标准了 姑且把我当个正常人
膳食标准没说体重 本文纯娱乐 纯假设 望纠正
代码
import tkinter as tk
from tkinter import ttk, messagebox
import webbrowser
def open_source_code_link():
webbrowser.open("https://blog.csdn.net/qq_45773834/article/details/144424704?fromshare=blogdetail&sharetype=blogdetail&sharerId=144424704&sharerefer=PC&sharesource=qq_45773834&sharefrom=from_link")
def update_standard_info(*args):
standard = standard_var.get()
if standard == "自定义":
custom_standard_entry.config(state="normal")
else:
custom_standard_entry.delete(0, tk.END)
custom_standard_entry.config(state="disabled")
info = standard_info.get(standard, "")
standard_info_label.config(text=info)
def on_abv_change(event):
if abv_var.get() == "自定义":
custom_abv_entry.config(state="normal")
else:
custom_abv_entry.delete(0, tk.END)
custom_abv_entry.config(state="disabled")
def copy_to_clipboard():
result_text = result_label.get("1.0", tk.END).strip()
if result_text:
root.clipboard_clear()
root.clipboard_append(result_text)
def calculate():
sex = gender_var.get()
if sex not in ["M", "F"]:
messagebox.showerror("错误", "请选择性别。")
return
# 获取体重
weight_str = weight_entry.get().strip()
if weight_str == "":
weight = 70.0 if sex == "M" else 60.0 # 假设:男性70kg,女性60kg
else:
try:
weight = float(weight_str)
if weight <= 0:
raise ValueError
except ValueError:
messagebox.showerror("错误", "体重输入有误,请输入大于0的数字。")
return
# 获取膳食标准
standard = standard_var.get()
if standard == "中国居民膳食指南":
base_recommended_alcohol = 25 if sex == "M" else 15
elif standard == "美国膳食指南":
base_recommended_alcohol = 28 if sex == "M" else 14
elif standard == "每日飲酒酒精標準量資訊圖表":
base_recommended_alcohol = 20 if sex == "M" else 10
elif standard == "自定义":
custom_standard_str = custom_standard_entry.get().strip()
try:
base_recommended_alcohol = float(custom_standard_str)
if base_recommended_alcohol <= 0:
raise ValueError
except ValueError:
messagebox.showerror("错误", "自定义膳食标准输入有误,请输入大于0的数字。")
return
else:
messagebox.showerror("错误", "请选择一个膳食标准。")
return
# 按体重调整推荐摄入量
standard_weight = 70.0 if sex == "M" else 60.0
recommended_alcohol = base_recommended_alcohol * (weight / standard_weight)
# 获取酒精度数
abv_selection = abv_var.get()
if abv_selection.startswith("5%"):
abv = 5.0
elif abv_selection.startswith("12%"):
abv = 12.0
elif abv_selection.startswith("40%"):
abv = 40.0
elif abv_selection == "自定义":
custom_abv_str = custom_abv_entry.get().strip()
try:
abv = float(custom_abv_str)
if abv <= 0 or abv > 100:
raise ValueError
except ValueError:
messagebox.showerror("错误", "自定义酒精度数输入有误,请输入0-100之间的数字。")
return
else:
messagebox.showerror("错误", "请选择或输入酒精度数。")
return
# 计算可饮用毫升数
ml = recommended_alcohol / ((abv / 100.0) * 0.8)
# 显示结果
sex_str = "男性" if sex == "M" else "女性"
explanation = (
f"模型解释:本计算假设标准体重为男性70kg、女性60kg,\n"
f"并根据输入体重按线性比例调整推荐摄入量。\n"
f"公式为:调整后摄入量 = 标准摄入量 × (实际体重 / 假设体重)。"
)
result_text = (
f"根据所选标准:{standard}\n"
f"假设标准体重:{standard_weight:.1f} kg\n"
f"您的体重:{weight:.1f} kg\n"
f"体重调整后每日建议不超过 {recommended_alcohol:.2f} 克纯酒精。\n"
f"对于 {abv}% 的酒精度数,建议饮用量约为:\n\n"
f"----------- {ml:.2f} 毫升 -----------\n\n"
f"{explanation}\n\n"
f"声明:本计算器纯属娱乐用途。"
)
result_label.delete("1.0", tk.END)
result_label.insert(tk.END, result_text)
# 启用复制按钮
copy_button.config(state="normal")
# 标准详细信息字典
standard_info = {
"中国居民膳食指南": "中国居民膳食指南建议:\n男性假设体重70kg,不超过25克纯酒精,\n女性假设体重60kg,不超过15克纯酒精。",
"美国膳食指南": "美国膳食指南建议:\n男性假设体重70kg,每天不超过2标准杯(约28克纯酒精),\n女性假设体重60kg,每天不超过1标准杯(约14克纯酒精)。",
"每日飲酒酒精標準量資訊圖表": "根據衛生福利部發表的「每日飲酒酒精標準量」指出:\n成年男性假设体重70kg,不超过2单元(20克纯酒精),\n女性假设体重60kg,不超过1单元(10克纯酒精)。"
}
# 酒精度数选项及说明
abv_options = [
"5%(典型啤酒)",
"12%(典型葡萄酒)",
"40%(典型白酒)",
"自定义"
]
# 创建主窗口
root = tk.Tk()
root.title("🍹 酒精饮用量建议计算器【纯属娱乐 切勿当真】 🍸")
root.geometry("1200x580")
root.configure(bg="#FAFAFA")
# 主框架
main_frame = tk.Frame(root, bg="#FAFAFA")
main_frame.pack(fill="both", expand=True, padx=20, pady=20)
# 输入部分
input_frame = tk.Frame(main_frame, bg="#FAFAFA")
input_frame.pack(side="left", fill="y", padx=20, pady=10)
title_label = ttk.Label(input_frame, text="🍹 输入数据 🍸", font=("Helvetica", 18, "bold"))
title_label.pack(pady=10)
# 性别选择
gender_frame = ttk.LabelFrame(input_frame, text="性别选择", padding=(10, 10))
gender_frame.pack(fill="x", pady=5)
gender_var = tk.StringVar(value="M") # 默认男性
male_radio = ttk.Radiobutton(gender_frame, text="男性", value="M", variable=gender_var)
female_radio = ttk.Radiobutton(gender_frame, text="女性", value="F", variable=gender_var)
male_radio.pack(side="left", padx=5)
female_radio.pack(side="left", padx=5)
# 体重输入
weight_frame = ttk.LabelFrame(input_frame, text="体重输入 (kg) (可选)", padding=(10, 10))
weight_frame.pack(fill="x", pady=5)
weight_entry = ttk.Entry(weight_frame, width=10)
weight_entry.insert(0, "70") # 默认体重
weight_entry.pack(side="left", padx=5)
ttk.Label(weight_frame, text="(默认男性70kg,女性60kg)").pack(side="left")
# 膳食标准选择
standard_frame = ttk.LabelFrame(input_frame, text="选择膳食标准", padding=(10, 10))
standard_frame.pack(fill="x", pady=5)
standard_var = tk.StringVar()
standards = list(standard_info.keys()) + ["自定义"]
standard_combo = ttk.Combobox(standard_frame, textvariable=standard_var, values=standards, state="readonly", width=25)
standard_combo.pack(side="left", padx=5)
standard_combo.current(0)
standard_var.trace("w", update_standard_info)
custom_standard_entry = ttk.Entry(standard_frame, state="disabled", width=10)
custom_standard_entry.pack(side="left", padx=5)
standard_info_label = ttk.Label(input_frame, text=standard_info[standards[0]], wraplength=300, justify="left")
standard_info_label.pack(pady=5)
# 酒精度数选择
abv_frame = ttk.LabelFrame(input_frame, text="选择酒精度数", padding=(10, 10))
abv_frame.pack(fill="x", pady=5)
abv_var = tk.StringVar()
abv_combo = ttk.Combobox(abv_frame, textvariable=abv_var, values=abv_options, state="readonly", width=20)
abv_combo.pack(side="left", padx=5)
abv_combo.current(1)
abv_combo.bind("<<ComboboxSelected>>", on_abv_change)
custom_abv_entry = ttk.Entry(abv_frame, state="disabled", width=10)
custom_abv_entry.pack(side="left", padx=5)
ttk.Label(abv_frame, text="%").pack(side="left")
# 计算按钮
calc_button = ttk.Button(input_frame, text="计算", command=calculate)
calc_button.pack(pady=10)
# 输出部分
output_frame = tk.Frame(main_frame, bg="#FAFAFA")
output_frame.pack(side="right", fill="both", expand=True, padx=20, pady=10)
result_title = ttk.Label(output_frame, text="🍸 计算结果 🍹", font=("Helvetica", 18, "bold"))
result_title.pack(pady=10)
result_label = tk.Text(output_frame, wrap="word", font=("Helvetica", 12), height=20, width=50)
result_label.pack(padx=10, pady=10, fill="both", expand=True)
copy_button = ttk.Button(output_frame, text="📋 一键复制结果", command=copy_to_clipboard, state="disabled")
copy_button.pack(pady=10)
# 版权信息
footer_frame = tk.Frame(root, bg="#FAFAFA")
footer_frame.pack(fill="x", pady=10)
footer_label = ttk.Label(footer_frame, text="访问 ", font=("Helvetica", 10))
footer_label.pack(side="left", padx=5)
source_code_link = ttk.Label(footer_frame, text="点击获取源代码(CSDN Ashbravo)", foreground="blue", cursor="hand2", font=("Helvetica", 10, "underline"))
source_code_link.pack(side="left")
source_code_link.bind("<Button-1>", lambda e: open_source_code_link())
# end
root.mainloop()
打包
pip install pyinstaller
pyinstaller --onefile --windowed --hidden-import=tkinter 酒量计算器.py
体验
参考
https://v.douyin.com/iULv34hH/ 03/28 q@E.hO VLw:/