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

Tkinter循环设置Label的row参数后仅显示最后一项的问题解决

问题分析与解决

核心原因

你在print_names()函数里循环创建Label时,所有组件都指定了相同的row=3,导致三个名字的Label重叠在同一行,最后一个“Jenny”会覆盖前面的两个,所以只能看到最后一项。而print_ages()和print_gender()没设置row参数,Tkinter的grid布局会自动将新组件放在对应列的下一个空行,因此能正常显示所有项。

解决方法

给每个Label分配递增的row值,从标题行(row=2)的下一行开始依次排列,同时可以优化避免重复点击按钮时创建大量重复组件:

修改后的完整代码

from tkinter import *
from tkinter.font import BOLD

gui = Tk()
jnames = [['Jamie','25','Male'],['John','22','Male'],['Jenny','23','Female']]
# 保存已创建的Label,方便后续清理
name_labels = []
age_labels = []
gender_labels = []

def quit():
    gui.quit()

def clear_labels(label_list):
    # 清空指定列表里的所有Label
    for label in label_list:
        label.destroy()
    label_list.clear()

def print_names():
    clear_labels(name_labels)
    # 从row=3开始,逐个递增行号
    for idx, x in enumerate(jnames):
        label = Label(gui, text=x[0])
        label.grid(column=0, row=3+idx)
        name_labels.append(label)

def print_ages():
    clear_labels(age_labels)
    for idx, x in enumerate(jnames):
        label = Label(gui, text=x[1])
        label.grid(column=1, row=3+idx)
        age_labels.append(label)

def print_gender():
    clear_labels(gender_labels)
    for idx, x in enumerate(jnames):
        label = Label(gui, text=x[2])
        label.grid(column=2, row=3+idx)
        gender_labels.append(label)

def main():
    Button(gui, text='Quit', command=quit).grid(column=1, row=0, sticky=EW)
    Button(gui, text='Print names', command=print_names).grid(column=0, row=1, sticky=EW)
    Button(gui, text='Print age', command=print_ages).grid(column=1, row=1, sticky=EW)
    Button(gui, text='Print gender', command=print_gender).grid(column=2, row=1, sticky=EW)
    Label(gui, text='Name', font=BOLD, width=15).grid(column=0, row=2, sticky=EW)
    Label(gui, text='Age', font=BOLD, width=15).grid(column=1, row=2, sticky=EW)
    Label(gui, text='Gender', font=BOLD, width=15).grid(column=2, row=2, sticky=EW)
    gui.mainloop()

main()

关键改动说明

  1. 递增row值:用enumerate获取循环索引,每个Label的row设置为3+idx,确保每个名字在单独的行显示,不会重叠。
  2. 组件清理:添加clear_labels函数,每次点击按钮前先销毁之前创建的Label,避免重复点击导致界面堆积大量重复组件。
  3. 统一布局:给print_ages()和print_gender()也加上固定row值,确保三列内容对齐,不会出现跨行混乱的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:51:34