饮酒计算器【纯属娱乐 切勿当真】

背景

抖音刷到:乙醇 > 乙醇脱氢酶 > 乙醛(一级致癌物) > 乙醛脱氢酶 > 乙酸

人晕不晕的是大脑反应 这个可以“练习”
但是出去挥发、尿液排除的,大都是在肝脏代谢,这个不可以”练习“

能喝多少酒 和体重 和基因 有关系

基因我没测 只能看看卫生组织标准了 姑且把我当个正常人

膳食标准没说体重 本文纯娱乐 纯假设 望纠正

代码

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:/ 

https://mental-health.gov.taipei/News_Content.aspx?n=575BAF540B4FF1F0&sms=C230FD70DBA59E39&s=8005436921133F52

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值