我正在通过此功能创建一组按钮:
from tkinter import *
from random import randint
window = Tk()
window.title("Test")
window.geometry('200x200')
color = ["red","blue","green","yellow","black","purple","orange"]
RandInt = 0
j = 0
h = 0
def ButtonDef(xvar = 0,yvar = 0):
btn = Button(command =lambda:[RandomColor()])
btn.grid()
btn.place(x = xvar*50, y = yvar*50, width = 50, height = 50)
def RandomColor():
RandInt = randint (0,6)
btn.configure(bg = color[RandInt])
while j in range (4):
i = 0
j += 1
while i in range (4):
ButtonDef(i,h)
i += 1
if i == 4:
h += 1
window.mainloop()
然而,我的RandomColor()
功能只改变我按下的按钮的颜色 - 这也很有趣,但我想知道我怎么能让它随机改变所有按钮。当由函数创建时,我会猜到所有创建的按钮都被命名为" btn"因为那是我给他们的唯一名字。
如何在一组按功能创建的按钮中解决所有(或一个特定的)按钮? 或简单地说,所有这些按钮都有什么名称?他们是否分享了这个名字" btn"?他们是否分配了隐藏ID?
答案 0 :(得分:1)
试试
btn = []
for i in range(16):
btn.append(Button(window))
它将创建一个按钮数组。所以你可以通过btn [i] .configure(command = lambda:[RandomColor()])或其他东西访问。
答案 1 :(得分:1)
问题背后的原因:
问题在于,当循环结束时执行此行:btn = Button(command =lambda:[RandomColor()])
时,只能获得对创建的最后一个按钮的引用。你松开了对其他按钮的引用。
<强>解决方案:强>
如果您依赖winfo_children()
,则可以解决此问题。
您必须执行两个步骤来解决问题:
首先,将btn = Button(command =lambda:[RandomColor()])
更改为btn = Button(window, command=lambda:[RandomColor()])
。这只是意味着我们将每个创建的按钮附加到名为window
的父窗口小部件。
然后您需要更改的是RandomColor()
函数体,如下所示:
def RandomColor():
for child in window.winfo_children():
child.configure(bg=color[randint(0,6)])
<强>演示:强>
这解决了您的问题,但您的代码不干净。您可以在Code Review网站上提出改进代码的建议。
编辑:
以下是您在评论中描述的方案的解决方案。
请注意,我必须从头开始创建代码,更清洁(我知道你今天才开始,所以我不是在责怪你)。在这段代码中,我为每个创建的按钮保留了参考:
import tkinter as tk
import random
class ChangeBottomRightColor(tk.Frame):
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, self.master)
self.__colors = ["red","blue","green","yellow","black","purple","orange"]
self.configure_gui()
self.create_widgets()
def configure_gui(self):
pass
def create_widgets(self):
self.create_buttons()
def create_buttons(self):
self.buttons = {}
c = 0
for i in range(4):
for j in range(4):
self.buttons['button{}'.format(c)] = tk.Button(self.master)
self.buttons['button{}'.format(c)].grid(row=i, column=j)
self.buttons['button{}'.format(c)].config(width=3, height=3)
self.buttons['button{}'.format(c)].config(command=self.change_bottom_right_button_color)
c += 1
def get_random_color(self):
return random.choice(self.__colors)
def change_bottom_right_button_color(self):
self.buttons['button{}'.format(15)].config(bg=self.get_random_color())
if __name__ == '__main__':
root = tk.Tk()
main_app = ChangeBottomRightColor(root)
root.mainloop()
<强>演示:强>