如何按列表逆序排列Python Tkinter组件标签?
解决Tkinter网格行标签顺序反转的问题
嘿,我来帮你搞定这个问题!你的问题出在行号的设置逻辑上:你直接把height列表里的字符串值当成了grid()方法的row参数,但Tkinter的row是按数值从小到大从上到下排列的——row=1会显示在最上方,row=5则在最下方,这就导致你想要的5→4→3→2→1变成了反过来的1→2→3→4→5。
修复方案
我们需要把height列表的元素和行号对应起来:让列表的第一个元素('5')对应最上方的行(row=0),第二个元素('4')对应下一行(row=1),以此类推。具体修改两处即可:
- 调整
make_label函数,让它接收行的显示文本和行号两个参数,把文本设置为你想要的height元素值。 - 生成矩阵时,用
enumerate遍历height,拿到每个元素的索引作为行号,元素本身作为显示文本。
修改后的完整代码
from tkinter import * import random # Create variables for these for the grid width/height width = 5 height = ['5', '4', '3', '2', '1'] def fill_auto(): for i in range(1, 6): rd_row = random.randrange(0, 5) rd_col = random.randrange(0, width) rd_num = random.randrange(50, 100) print(rd_row, rd_col, rd_num) # Set the label text matrix[rd_row][rd_col].config(text=str(rd_num)) root = Tk() root.geometry('+0+0') root.configure(bg='black') frame1 = Frame(root) frame1.pack() # Helper function to create a label - 修改:接收行文本和行号 def make_label(x, row_num, row_text): l = Label(frame1, width=5, relief='solid', text=row_text) l.grid(column=x, row=row_num) return l # 修改:用enumerate获取索引(行号)和元素(行文本) matrix = [[make_label(x, idx, val) for x in range(width)] for idx, val in enumerate(height)] frame2 = Frame(root) frame2.pack() btn = Button(frame2, text='start', command=fill_auto) btn.grid(row=0, column=0) root.mainloop()
关键修改点解释
enumerate(height)会返回(索引, 元素)的元组,比如第一个元组是(0, '5'),第二个是(1, '4')……这样索引idx作为row参数,就能让'5'显示在最上方的行。make_label函数新增了row_text参数,直接把height里的元素作为标签文本,不用再拼接box字符串,符合你想要的行标签需求。
这样修改后,你的网格行就会从上到下显示5、4、3、2、1啦!
内容的提问来源于stack exchange,提问作者shkhoo
相关产品推荐
相关产品推荐

