Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tkinter(Python3)中声明循环中的按钮_Python_Python 3.x_Loops_User Interface_Tkinter - Fatal编程技术网

在Tkinter(Python3)中声明循环中的按钮

在Tkinter(Python3)中声明循环中的按钮,python,python-3.x,loops,user-interface,tkinter,Python,Python 3.x,Loops,User Interface,Tkinter,我以前从未创建过GUI,我决定尝试使用tkinter在Python3中创建一个GUI 我想创建一个5x5“矩阵”的按钮,改变颜色和文字时按下。在谷歌搜索之后,我找到了一个按钮的实现方法,原则上我可以复制粘贴并创建我需要的25个按钮。但是,我想找到一种更优雅的方法在循环中完成它。我的问题是,我需要给每个按钮赋予不同的名称,但我不知道如何做到这一点 我希望这个问题足够清楚。提前感谢您的帮助 下面是一个非常简单的示例,通过列出所有25种颜色,然后使用传统的矩阵循环并将项目分配给按钮,如: from t

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

我想创建一个5x5“矩阵”的按钮,改变颜色和文字时按下。在谷歌搜索之后,我找到了一个按钮的实现方法,原则上我可以复制粘贴并创建我需要的25个按钮。但是,我想找到一种更优雅的方法在循环中完成它。我的问题是,我需要给每个按钮赋予不同的名称,但我不知道如何做到这一点


我希望这个问题足够清楚。提前感谢您的帮助

下面是一个非常简单的示例,通过列出所有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
捕获出现的
索引器并忽略它

该函数是如何工作的?: 您正在使用
lambda
创建一个新的无名函数,该函数接受
btn
color
,并将
btn
color
传递给
color\u changer()
。通过这种方式,我们可以存储相应的
btn
color
,这与您通常像
lambda:color\u changer(btn,color)
那样分配它不同,它只会传递最后一个弹出的项。这通常是我们为循环中的按钮分配命令的方式

替代方案(lambda
): 还可以使用嵌套函数(避免
lambdas
)。因此,函数如下所示:

def nester(btn,color):
    def color_changer():
        btn.config(fg=color)
    return color_changer
btn['command'] = nester(btn,color)
命令如下:

def nester(btn,color):
    def color_changer():
        btn.config(fg=color)
    return color_changer
btn['command'] = nester(btn,color)

这类似于
functools.partial
的功能。

您不必给出不同的名称,列出颜色列表,然后循环使用颜色。选中@CoolCloud Mmmh您的意思是,每当我单击特定按钮时,我都可以更新颜色列表?我将努力实现这一点idea@JacksonPro哦,太好了!我还没看到呢!谢谢lot@CoolCloud那太棒了!!!非常感谢!!:)最后一个问题:有没有办法立即改变颜色?我注意到它只有在指针离开按下的按钮后才会改变。@只有当你按下按钮时,颜色才会改变,正如你的问题所说,“我想创建一个5x5“矩阵”,按钮在按下时会改变颜色和文本。”。是的,没错!它确实工作得很好。然而,我想知道为什么我只有在指针离开按钮后才能看到颜色。@Onil90这很奇怪,粘贴在这里的代码决不能这样做。只有你点击它,它才会改变颜色。