首页 > 解决方案 > Python tkinter:创建和控制许多小部件

问题描述

如果我有很多小部件,是否有一个小部件索引可以方便地控制它们?例如,假设我需要创建 10 x 10 个标签,我可以运行以下简单代码:

from tkinter import *

root = Tk()
for i in range(10):
   for j in range(10):
      label = Label(root, text = f'{i}, {j}')
      label.grid(row = i, column = j, padx = 5, pady = 5)

root.mainloop()

稍后的问题是如何更改一个特定标签的文本?显然,我不想一一手动定义标签(即label0_0、label0_1、...、label9_9)。那么有没有办法我们可以使用小部件索引之类的东西来控制它?就像是

    from tkinter import *
    
    root = Tk()
    for i in range(10):
       for j in range(10):
          label[i][j] = Label(root, text = f'{i}, {j}')
          label[i][j].grid(row = i, column = j, padx = 5, pady = 5)
          # Clearly, there are mistakes here
    root.mainloop()
'''

标签: pythonuser-interfacetkinter

解决方案


试试这个代码:

from tkinter import *

root = Tk()
# Create an empty list for the labels
labels = []

for i in range(3):
    row = [] # Create an empty list for the row of labels
    for j in range(3):
        label = Label(root, text=f"{i}{j}")
        label.grid(row=i, column=j, padx=5, pady=5)
        row.append(label) # Put the new label at the end of the list
    labels.append(row) # Put the list of labels at the end of the list

print("All of the labels:", labels, end="\n\n")
print("labels[0]:", labels[0], end="\n\n")
print("labels[0][0]:", labels[0][0], end="\n\n")

# Change the text in labels[0][1]
labels[0][1].config(text="New text")

root.mainloop()

看看它在屏幕上打印的内容:

  1. 包含所有Label对象的列表列表
  2. 一个列表(s 的第一行Label
  3. 第一Label排的第一个。

也只是为了展示如何更改Label我添加的 a 的文本labels[0][1].config(text="New text"),该文本会更改第一行中第二个标签的文本。

请记住,所有 python 列表都是基于 0 的。所以要得到你使用的第一个项目list_name[0],得到你使用的第二个项目list_name[1],...


推荐阅读