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

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()

额外优化说明

  1. 调整了宝可梦按钮的布局逻辑,自动按每行6个排列,避免按钮重叠。
  2. 简化了generar_pokimons中的条件判断逻辑,代码更简洁。
  3. 按钮文本显示宝可梦的名称(item.name),而不是对象本身,更直观。
  4. 每次生成宝可梦前清空pokimones列表,避免重复添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:57:02