Python Tkinter - 函数创建的对象的名称

时间:2018-05-15 06:55:28

标签: python function tkinter

我正在通过此功能创建一组按钮:

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?

2 个答案:

答案 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)])

<强>演示:

enter image description here

这解决了您的问题,但您的代码不干净。您可以在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()

<强>演示:

enter image description here