You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter随机名字生成器点击按钮不刷新及分类选择问题

问题修复说明

核心问题点

  • 随机取值逻辑仅在程序启动时执行一次,点击生成按钮不会重新计算随机值
  • 每次点击重复创建展示名称的Label控件,新旧内容堆叠无法看到更新
  • 所有复选框共用同一个绑定变量,无法正确识别用户选中的分类
  • 生成逻辑固定输出希腊神话分类名称,未关联勾选的分类配置

修正后完整代码

import tkinter as tk
from tkinter import StringVar
import random

# 各分类名称库
name_lib = {
    "fantasy": ("Hunter", "Rage", "Ash", "Money", "Ace", "Charles", "Ajax", "Rocket", "Harden",
                "Blaze", "Rich", "Ghost", "Joker", "Queen", "Azure", "Zeus", "Apollo", "Hephaistos", "Aqua",
                "Rain", "Apex", "Flame", "Cronos", "Kim", "Adras", "Achilles", "Alena", "Hades",
                "Ares", "Athena", "Alistair", "Alyx", "Parker", "Nereus", "Reaper", "Bacchus", "Aino", "Tara", "Eris", "Iuno", "Devaraja",
                "Hector", "Aditi", "Mabon", "Astraia", "Deimos", "Demeos", "Demon", "Lucifer", "Angel", "Kerberos", "Cerberus", "Zinon",
                "Lycus", "Lamia", "Thanatos", "Leucippus", "Thaleia"),
    "medieval": ("Zemislav", "Wolf", "Titian", "Teague", "Savage", "Salvador", "Rogue", "Richard", "Radax", "Pascal",
                 "Osmund", "Novel", "Milo", "Maurin", "Lucan", "Justus", "Jerome", "Hawk",
                 "Gregory", "Finnian", "Emil", "Drew", "Crispin", "Bjorn", "Alan"),
    "greek_myth": ("Acestes", "Achilles", "Acis", "Acontius", "Actaeon",
                   "Admetus", "Adonis", "Aecus", "Aedon", "Aeolus", "Baucis",
                   "Bellerophon", "Bendis", "Biton", "Boreas", "Briareus", "Busiris",
                   "Britomaris", "Caberiri"),
    "japanese": ("Fuji", "Homura", "Kaito", "Mizu", "Shimizu", "Asahi",
                 "Sora", "Riku", "Fujin", "Izanagi", "Kuebiko", "Raiden", "Raijin",
                 "Ryujin", "Kojin", "Suijin", "Tenjin", "Tsukiyomi", "Takemikazuchi",
                 "Aoki", "Endo", "Inoue", "Ito"),
    # 可自行补充修改罗马、俄罗斯分类的名称列表
    "roman": ("Augustus", "Marcus", "Julius", "Antonius", "Octavia", "Livia"),
    "russian": ("Alexei", "Anastasia", "Nikolai", "Katya", "Vladimir", "Svetlana")
}

root = tk.Tk()
root.title("随机名字生成器")

# 存储各分类复选框的选中状态
check_vars = {
    "medieval": tk.BooleanVar(value=False),
    "greek_myth": tk.BooleanVar(value=False),
    "japanese": tk.BooleanVar(value=False),
    "roman": tk.BooleanVar(value=False),
    "fantasy": tk.BooleanVar(value=False),
    "russian": tk.BooleanVar(value=False)
}

# 提前创建展示名字的Label,避免重复新建
labelRandomname = None

def onClick():
    global labelRandomname
    # 收集所有选中的分类的名称列表
    selected_names = []
    for cate, is_selected in check_vars.items():
        if is_selected.get():
            selected_names.extend(name_lib[cate])
    # 如果没选任何分类,默认用所有分类的名字
    if not selected_names:
        for names in name_lib.values():
            selected_names.extend(names)
    # 生成新的随机名字
    new_name = random.choice(selected_names)
    # 更新Label内容
    if labelRandomname is None:
        labelRandomname = tk.Label(framedisplay, text=new_name, font=("Broadway", 36), bg="#d3d3d3")
        labelRandomname.place(relx=0.35, rely=0.35)
    else:
        labelRandomname.config(text=new_name)


canvas = tk.Canvas(root, height=800, width=800, bg="#17517e")
canvas.pack()

frame = tk.Frame(root, bg="white")
frame.place(relwidth=0.97, relheight=0.97, relx=0.015, rely=0.015)

framedisplay = tk.Frame(root, bg="#d3d3d3")
framedisplay.place(relwidth=0.75, relheight=0.35, relx=0.125, rely=0.575)

labelwelcome = tk.Label(frame, text=" Random Name Generator! ", width=25, height=1,
                        font=("Berlin Sans FB", 24), fg="red", bg="white")
labelwelcome.pack()

labelYourname = tk.Label(framedisplay, text="Your name is: ", font=("Berlin Sans FB", 20), bg="#d3d3d3")
labelYourname.pack()

labelCategory = tk.Label(frame, text="Select your name category",
                         font=("Arial", 14))
labelCategory.pack()
labelCategory.place(relx=0.350, rely=0.105)

medievalCheck = tk.Checkbutton(frame, text="Medieval", font=("Comic Sans MS", 12), variable=check_vars["medieval"])
medievalCheck.pack()
medievalCheck.place(relx=0.20, rely=0.160)

greekmythCheck = tk.Checkbutton(frame, text="Greek Mythology", font=("Comic Sans MS", 12), variable=check_vars["greek_myth"])
greekmythCheck.pack()
greekmythCheck.place(relx=0.40, rely=0.160)

japaneseCheck = tk.Checkbutton(frame, text="Japanese", font=("Comic Sans MS", 12), variable=check_vars["japanese"])
japaneseCheck.pack()
japaneseCheck.place(relx=0.67, rely=0.160)

romanCheck = tk.Checkbutton(frame, text="Roman", font=("Comic Sans MS", 12), variable=check_vars["roman"])
romanCheck.pack()
romanCheck.place(relx=0.20, rely=0.25)

fantasyCheck = tk.Checkbutton(frame, text="Fantasy", font=("Comic Sans MS", 12), variable=check_vars["fantasy"])
fantasyCheck.pack()
fantasyCheck.place(relx=0.40, rely=0.25)

russianCheck = tk.Checkbutton(frame, text="Russian", font=("Comic Sans MS", 12), variable=check_vars["russian"])
russianCheck.pack()
russianCheck.place(relx=0.67, rely=0.25)

generateButton = tk.Button(frame, text="Generate!", padx=40, pady=25, fg="grey", bg="black", foreground="White",
                           font=("Bauhaus 93", 20), command=onClick)
generateButton.pack()
generateButton.place(relx=0.36, rely=0.40)

root.mainloop()

功能说明

  • 支持同时勾选多个分类,生成时会从所有选中分类的名称池中随机取值
  • 未勾选任何分类时默认从全部分类中随机取名字
  • 每次点击生成按钮都会重新计算随机值,不会出现内容不更新的问题
  • 补充了原代码缺失的罗马、俄罗斯分类名称库,可自行修改扩展

内容的提问来源于stack exchange,提问作者YailliGinseng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 09:36:07