0

我以前从未创建过 GUI,我决定尝试使用 tkinter 在 Python3 中创建一个。

我想创建一个 5x5 的按钮“矩阵”,按下时会改变颜色和文本。经过一番谷歌搜索,我想出了如何为一个按钮做这件事,原则上我可以复制粘贴并创建我需要的 25 个按钮。但是,我想找到一种更优雅的方法来在循环中执行此操作。我的问题是我需要为每个按钮指定不同的名称,但我不知道该怎么做。

我希望这个问题足够清楚。预先感谢您的任何帮助!!

4

1 回答 1

1

这是一个非常简单的示例,说明如何做到这一点,通过列出所有 25 种颜色,然后使用传统的矩阵循环并将项目分配给按钮,例如:

from tkinter import *

root = Tk()

colors = ['Red','Orange','Yellow','Green','Blue','Purple','Brown','Magenta',
        'Tan','Cyan','Olive','Maroon','Navy','Aquamarine','Turquoise','Silver',
        'Lime','Teal','Indigo','Violet','Pink','Black','White','Gray','crimson']
colors = list(reversed(colors)) # Reversing list bc pop returns last item

def color_changer(btn,color):
    btn.config(fg=color) # Change the color of the corresponding button

for i in range(5): # Number of rows
    for j in range(5): # Number of column
        color = colors.pop()  # First color
        btn = Button(root,text=color,fg='black',width=25)
        btn.grid(row=i,column=j) # Place the widget
        btn['command'] = lambda btn=btn,color=color: color_changer(btn,color) # Assign a command

root.mainloop()

这里有一个警告,您应该准确定义 25 种颜色,否则,您应该使用try捕捉IndexError出现的颜色并忽略它。

该函数是如何工作的?: 您正在使用lambda创建一个新的无名函数,该函数接收btn并将其color传递给. 这样我们就可以存储对应的 and ,不像你通常分配的那样,它只是传递最后一个弹出的项目。这通常是我们为循环内的按钮分配命令的方式。btncolorcolor_changer()btncolorlambda: color_changer(btn,color)

Alternative(to lambda): 你也可以使用嵌套函数(avoiding lambdas)。所以函数就像:

def nester(btn,color):
    def color_changer():
        btn.config(fg=color)
    return color_changer

命令如下:

btn['command'] = nester(btn,color)

这类似于做什么functools.partial

于 2021-01-31T16:50:46.053 回答