Python Tkinter重构后无法切换第二页且Pokemon列表为空
问题分析与修复方案
核心错误点
- 确认按钮未绑定触发函数:重构后的
btn1没有设置command=accion,点击按钮完全不会执行任何逻辑。 - 玩家数量计算时机错误:
cantidad_jugadores = len(jugadores)在程序启动时就赋值,此时jugadores是空列表,值为0,后续生成宝可梦时numero_pokimons = 0,循环不会执行,导致pokimons始终为空。 - 全局变量未正确声明:
generar_pokimons函数中修改全局变量pokimones时,未使用global关键字声明,导致函数内创建了局部变量pokimones,全局的pokimones不会被更新。 - 宝可梦名称列表初始化过早:
elegibles = [pypokedex.get(dex=dex_number) for dex_number in pokimons]在程序启动时执行,此时pokimons为空,后续生成宝可梦后也未重新生成该列表,导致按钮创建逻辑遍历空列表。 - 按钮创建逻辑的变量引用错误:
crear_boton函数中未传递item变量,导致按钮文本无法正确获取宝可梦名称。 - 布局参数的引号冗余:
sticky="\"nsew\""中的嵌套引号是无效语法,会导致布局异常。
修复后的完整代码
import tkinter as tk from tkinter import * import random import pypokedex root = tk.Tk() # 主窗口 jugadores = [] # 玩家列表 pokimones = [] # 生成的宝可梦编号列表 def accion(): # 切换到选择页面的触发函数 quienes_juegan_geteado = quienes_juegan.get() variablesss = quienes_juegan_geteado.split() jugadores.extend(variablesss) print(jugadores) generar_pokimons() # 生成宝可梦名称列表 global elegibles elegibles = [pypokedex.get(dex=dex_number) for dex_number in pokimones] botoncitos(elecciones) elecciones.tkraise() def botoncitos(elecciones): # 创建宝可梦按钮,每行6个 def crear_boton(item): def seleccionar_pokemon(): button.config(state=DISABLED) button = Button(elecciones, text=item.name, command=seleccionar_pokemon) # 计算行列位置,每行6个 row_idx = len(elecciones.winfo_children()) // 6 col_idx = len(elecciones.winfo_children()) % 6 button.grid(row=row_idx, column=col_idx, sticky="nsew") for item in elegibles: crear_boton(item) def generar_pokimons(): global pokimones pokimones = [] # 清空之前的列表 # 实时获取当前玩家数量,计算需要生成的宝可梦数量 numero_pokimons = len(jugadores) * 6 legendarios = False legendary_list = [144,145,146,150,151,243,244,245,249,250,251,377,378,379,380,381,382,383,384,385,386,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,638,639,640,641,642,643,644,645,646,647,648,649,716,717,718,719,720,721,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809] while numero_pokimons != 0: poke = random.randint(1,809) if poke in pokimones: continue if legendarios: if poke in legendary_list: pokimones.append(poke) numero_pokimons -= 1 else: if poke not in legendary_list: pokimones.append(poke) numero_pokimons -= 1 pokimones = sorted(pokimons) # 第一页:输入玩家 inicio = Frame(root) inicio.grid(row=0, column=0) ttl = Label(inicio, text="¿Quienes juegan?") quienes_juegan = StringVar() txt1 = Entry(inicio, textvariable=quienes_juegan, width=50) # 绑定触发函数到确认按钮 btn1 = Button(inicio, text="Confirmar", command=accion) ttl.grid(padx=650) txt1.grid(pady=20) btn1.grid() # 第二页:选择宝可梦 elecciones = Frame(root) elecciones.grid(row=0, column=0) # 初始化显示第一页 inicio.tkraise() root.geometry("1400x250") root.mainloop()
额外优化说明
- 调整了宝可梦按钮的布局逻辑,自动按每行6个排列,避免按钮重叠。
- 简化了
generar_pokimons中的条件判断逻辑,代码更简洁。 - 按钮文本显示宝可梦的名称(
item.name),而不是对象本身,更直观。 - 每次生成宝可梦前清空
pokimones列表,避免重复添加。
内容的提问来源于stack exchange,提问作者Matias Wenger
相关产品推荐
相关产品推荐

