在Tkinter(Python3)中声明循环中的按钮
我以前从未创建过GUI,我决定尝试使用tkinter在Python3中创建一个GUI 我想创建一个5x5“矩阵”的按钮,改变颜色和文字时按下。在谷歌搜索之后,我找到了一个按钮的实现方法,原则上我可以复制粘贴并创建我需要的25个按钮。但是,我想找到一种更优雅的方法在循环中完成它。我的问题是,我需要给每个按钮赋予不同的名称,但我不知道如何做到这一点在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
我希望这个问题足够清楚。提前感谢您的帮助 下面是一个非常简单的示例,通过列出所有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这很奇怪,粘贴在这里的代码决不能这样做。只有你点击它,它才会改变颜色。