本文介绍了一个基于Python Tkinter的二次元姓名生成器GUI程序。该程序可以从预设的饮料名称和动漫角色名(分为男性和女性)中随机组合生成不超过5个字的二次元风格姓名。
主要功能包括:
1)可选择生成男生名或女生名;
2)点击按钮随机生成姓名;
3)支持复制结果到剪贴板。程序界面采用现代化设计,包含标题、性别选择区、生成按钮、结果显示区和复制按钮。
该工具适合二次元爱好者或需要随机姓名的场景使用。
import tkinter as tk
from tkinter import ttk
import random
import sys
# 扩展的饮料名称列表
beverages = [
"雪碧", "可乐", "旺仔", "奶茶", "咖啡", "橙汁", "绿茶", "红茶",
"牛奶", "酸奶", "椰汁", "柠檬", "美年达", "芬达", "脉动",
"冰红茶", "养乐多", "王老吉", "加多宝", "红牛", "乌龙茶", "茉莉",
"蜂蜜", "柚子", "蓝莓", "芒果", "草莓", "西瓜", "蜜桃", "葡萄",
"苹果", "香蕉", "菠萝", "石榴", "樱桃", "荔枝", "桂圆", "杏仁",
"核桃", "花生", "芝麻", "红豆", "绿豆", "黑豆", "燕麦", "小麦"
]
# 扩展的动漫角色列表(分为男性和女性)
male_chars = [
"司空震", "孙悟空", "路飞", "鸣人", "佐助", "柯南", "大雄",
"胖虎", "小夫", "黑崎", "银时", "冲田", "炭治郎", "善逸",
"伊之助", "索隆", "艾斯", "鼬", "卡卡西", "我爱罗", "犬夜叉",
"杀生丸", "夜斗", "坂田", "土方", "总悟", "新八", "剑心",
"斋藤", "绯村", "工藤", "服部", "基德", "赤井", "安室", "夏目",
"赵云", "韩信", "李白", "诸葛亮", "吕布", "关羽", "张飞",
"马超", "黄忠", "刘备", "曹操", "典韦", "夏侯惇", "夏侯渊",
"周瑜", "孙策", "孙权", "司马懿", "元歌", "百里守约", "百里玄策",
"铠", "曜", "镜", "澜", "暃", "晟", "李信", "盘古", "达摩", "哪吒"
]
female_chars = [
"小乔", "安琪拉", "静香", "灰原", "小兰", "露琪亚", "神乐",
"祢豆子", "娜美", "罗宾", "雏田", "井野", "赫敏", "亚丝娜",
"三笠", "小樱", "纲手", "日向", "天天", "手鞠", "戈薇", "桔梗",
"珊瑚", "神无", "神久夜", "雪女", "阎魔", "彼岸", "花子", "千与",
"波妞", "苏菲", "琪琪", "小梅", "小月", "小葵", "小玉", "小町",
"妲己", "貂蝉", "王昭君", "西施", "杨玉环", "大乔", "小乔",
"孙尚香", "虞姬", "芈月", "武则天", "甄姬", "嫦娥", "女娲",
"露娜", "镜", "阿轲", "花木兰", "公孙离", "瑶", "云缨", "夏洛特",
"蔡文姬", "安琪拉", "不知火舞", "娜可露露", "伽罗", "米莱狄"
]
def center_window(window, width, height):
"""将窗口居中显示"""
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
x = (screen_width - width) // 2
y = (screen_height - height) // 2
window.geometry(f"{width}x{height}+{x}+{y}")
def generate_name():
"""生成随机姓名"""
gender = gender_var.get()
# 确保生成的姓名不超过5个字
while True:
beverage = random.choice(beverages)
if gender == "男":
char = random.choice(male_chars)
else:
char = random.choice(female_chars)
full_name = beverage + char
# 检查总长度
if len(full_name) <= 5:
break
result_label.config(text=full_name)
copy_btn.config(state=tk.NORMAL) # 启用复制按钮
def copy_to_clipboard():
"""复制结果到剪贴板"""
result = result_label.cget("text")
if result and result != "点击上方按钮生成":
root.clipboard_clear()
root.clipboard_append(result)
copy_btn.config(text="已复制!")
root.after(2000, lambda: copy_btn.config(text="复制"))
def on_closing():
"""关闭窗口时的操作"""
root.destroy()
sys.exit()
# 创建主窗口
root = tk.Tk()
root.title("二次元姓名生成器")
root.resizable(False, False)
center_window(root, 400, 340)
# 设置主题颜色
bg_color = "#F5F5F5"
button_color = "#4D96FF"
button_hover = "#3A7BD5"
result_bg = "#FFFFFF"
frame_border = "#E0E0E0"
# 配置样式
style = ttk.Style()
style.theme_use("clam")
style.configure("TFrame", background=bg_color)
style.configure("TLabel", background=bg_color, font=("微软雅黑", 10))
style.configure("TButton", font=("微软雅黑", 11), background=button_color,
foreground="white", borderwidth=1, padding=5)
style.map("TButton", background=[("active", button_hover)])
style.configure("TRadiobutton", background=bg_color, font=("微软雅黑", 10))
style.configure("Title.TLabel", font=("微软雅黑", 16, "bold"), foreground="#333333")
style.configure("Result.TLabel", font=("微软雅黑", 18, "bold"), foreground="#4D96FF",
background=result_bg, anchor="center")
# 主框架
main_frame = ttk.Frame(root, padding=20)
main_frame.pack(fill=tk.BOTH, expand=True)
# 标题
title_label = ttk.Label(main_frame, text="二次元姓名生成器", style="Title.TLabel")
title_label.pack(pady=(0, 20))
# 性别选择框架
gender_frame = ttk.Frame(main_frame)
gender_frame.pack(pady=10)
gender_var = tk.StringVar(value="男")
male_rb = ttk.Radiobutton(gender_frame, text="男生名", variable=gender_var, value="男")
male_rb.pack(side=tk.LEFT, padx=15)
female_rb = ttk.Radiobutton(gender_frame, text="女生名", variable=gender_var, value="女")
female_rb.pack(side=tk.LEFT, padx=15)
# 生成按钮
btn_frame = ttk.Frame(main_frame)
btn_frame.pack(pady=15)
generate_btn = ttk.Button(btn_frame, text="生成有趣的名字", command=generate_name)
generate_btn.pack(side=tk.LEFT, padx=5)
# 结果显示区域
result_frame = ttk.Frame(main_frame, relief=tk.SOLID, borderwidth=1,
style="TFrame", padding=10)
result_frame.pack(fill=tk.X, pady=(10, 15), padx=20)
result_label = ttk.Label(result_frame, text="点击上方按钮生成",
style="Result.TLabel")
result_label.pack(fill=tk.BOTH, expand=True)
# 复制按钮
copy_btn = ttk.Button(main_frame, text="复制", command=copy_to_clipboard,
state=tk.DISABLED)
copy_btn.pack(pady=(0, 10))
# 关闭事件
root.protocol("WM_DELETE_WINDOW", on_closing)
# 运行主循环
root.mainloop()