【问题标题】:Declare buttons in a loop in Tkinter (Python3)在 Tkinter (Python3) 中循环声明按钮
【发布时间】:2021-01-31 13:07:17
【问题描述】:

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

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

我希望问题足够清楚。提前感谢您的任何帮助!

【问题讨论】:

  • 您不必给出不同的名称,制作颜色列表,然后循环浏览颜色。
  • 检查this
  • @CoolCloud 嗯,您的意思是每当我单击特定按钮时,我都可以更新颜色列表?我会努力实现这个想法
  • @JacksonPro 哦,太好了!我没见过!非常感谢
  • @CoolCloud 那太棒了!!!

标签: python python-3.x loops user-interface tkinter


【解决方案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 创建一个新的nameless 函数,该函数接受btncolor 并将btncolor 传递给color_changer()。这样我们就可以存储对应的btncolor,不像你通常会像lambda: color_changer(btn,color) 那样分配它,它只会传递最后一个弹出的项目。这通常是我们为循环内的按钮分配命令的方式。

替代方案(至lambda): 您还可以使用嵌套函数(避免使用lambdas)。所以函数应该是:

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

命令如下:

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

这类似于functools.partial 所做的。

【讨论】:

  • 最后一个问题:有没有办法让颜色立即改变?我注意到它只有在指针离开按下的按钮后才会改变。
  • @Onil90 颜色只有在您按下按钮时才会改变,正如您的问题所述,“我想创建一个 5x5 的按钮“矩阵”,按下时会改变颜色和文本。”。
  • 是的,没错!它确实工作正常。但是我想知道为什么只有在指针离开按钮后才能看到颜色。
  • @Onil90 这很奇怪,这里粘贴的代码绝不会那样做。只有点击它才会改变颜色。
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多