Python Tkinter - Имя объектов, созданных функцией - PullRequest
0 голосов
/ 15 мая 2018

Я создаю набор кнопок с помощью этой функции:

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», так как это единственное имя, которое я им дал.

Как я могу адресовать все (или одну конкретную) кнопку,из группы созданных по функциям кнопок?Или, проще говоря, какое имя имеют все эти кнопки?Они разделяют имя "БТН"?Им назначен скрытый идентификатор?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Причина вашей проблемы:

Проблема в том, что при выполнении этой строки: btn = Button(command =lambda:[RandomColor()]) к концу цикла вы получаете ссылку только на последнюю кнопкукоторый создан.Вы теряете ссылку на другие кнопки.

Решение:

Вы можете решить эту проблему, если положитесь на winfo_children().

Вы должны сделать 2 шага, чтобы решить вашу проблему:

Прежде всего, измените: 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

0 голосов
/ 15 мая 2018

Давайте попробуем

btn = []
for i in range(16):
    btn.append(Button(window))

, он создаст массив кнопок.Таким образом, вы можете получить доступ с помощью btn [i] .configure (command = lambda: [RandomColor ()]) или чего-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...