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
相关产品推荐
相关产品推荐

