Как избежать повторения кода при создании сетки кнопок?

#python

Вопрос:

В настоящее время я изучаю tkinter и написал код, который создает сетку из 100 кнопок, при нажатии на которые она исчезает (мне еще предстоит это закодировать). Однако, как видно ниже, это действительно неэффективно. Есть ли какой-нибудь способ сделать это лучше и быстрее для записи,поскольку я закодировал каждую кнопку 1a, 1b… и я хочу знать, есть ли лучший способ сделать это. Цель проекта-создать доску размером 10*10 с кнопками на каждом квадрате, при нажатии на которые они исчезают.

 # !/bin/python3
from tkinter import *
from PIL import ImageTk,Image

root = Tk()
root.title("Battleships")


def buttonClick():
    COMMAND= True
    if COMMAND == True:
        del button1a

    
# Creating the buttons
image1 = ImageTk.PhotoImage(Image.open("/home/lukas/Downloads/Battleships boats/AircraftCarrier.png"))
label1 = Label(image=image1)
label1.place(x=40, y=10)
button1a = Button(root, text="", padx=20, pady=10, command=buttonClick) 
button1b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button1j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button2j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button3j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button4j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button5j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button6j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button7j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button8j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button9j = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10a = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10b = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10c = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10d = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10e = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10f = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10g = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10h = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10i = Button(root, text="", padx=20, pady=10, command=buttonClick)
button10j = Button(root, text="", padx=20, pady=10, command=buttonClick)


# Placing buttons onto the board
button1a.grid(row=1, column=1)
button1b.grid(row=1, column=2)
button1c.grid(row=1, column=3)
button1d.grid(row=1, column=4)
button1e.grid(row=1, column=5)
button1f.grid(row=1, column=6)
button1g.grid(row=1, column=7)
button1h.grid(row=1, column=8)
button1i.grid(row=1, column=9)
button1j.grid(row=1, column=10)
button2a.grid(row=2, column=1)
button2b.grid(row=2, column=2)
button2c.grid(row=2, column=3)
button2d.grid(row=2, column=4)
button2e.grid(row=2, column=5)
button2f.grid(row=2, column=6)
button2g.grid(row=2, column=7)
button2h.grid(row=2, column=8)
button2i.grid(row=2, column=9)
button2j.grid(row=2, column=10)
button3a.grid(row=3, column=1)
button3b.grid(row=3, column=2)
button3c.grid(row=3, column=3)
button3d.grid(row=3, column=4)
button3e.grid(row=3, column=5)
button3f.grid(row=3, column=6)
button3g.grid(row=3, column=7)
button3h.grid(row=3, column=8)
button3i.grid(row=3, column=9)
button3j.grid(row=3, column=10)
button4a.grid(row=4, column=1)
button4b.grid(row=4, column=2)
button4c.grid(row=4, column=3)
button4d.grid(row=4, column=4)
button4e.grid(row=4, column=5)
button4f.grid(row=4, column=6)
button4g.grid(row=4, column=7)
button4h.grid(row=4, column=8)
button4i.grid(row=4, column=9)
button4j.grid(row=4, column=10)
button5a.grid(row=5, column=1)
button5b.grid(row=5, column=2)
button5c.grid(row=5, column=3)
button5d.grid(row=5, column=4)
button5e.grid(row=5, column=5)
button5f.grid(row=5, column=6)
button5g.grid(row=5, column=7)
button5h.grid(row=5, column=8)
button5i.grid(row=5, column=9)
button5j.grid(row=5, column=10)
button6a.grid(row=6, column=1)
button6b.grid(row=6, column=2)
button6c.grid(row=6, column=3)
button6d.grid(row=6, column=4)
button6e.grid(row=6, column=5)
button6f.grid(row=6, column=6)
button6g.grid(row=6, column=7)
button6h.grid(row=6, column=8)
button6i.grid(row=6, column=9)
button6j.grid(row=6, column=10)
button7a.grid(row=7, column=1)
button7b.grid(row=7, column=2)
button7c.grid(row=7, column=3)
button7d.grid(row=7, column=4)
button7e.grid(row=7, column=5)
button7f.grid(row=7, column=6)
button7g.grid(row=7, column=7)
button7h.grid(row=7, column=8)
button7i.grid(row=7, column=9)
button7j.grid(row=7, column=10)
button8a.grid(row=8, column=1)
button8b.grid(row=8, column=2)
button8c.grid(row=8, column=3)
button8d.grid(row=8, column=4)
button8e.grid(row=8, column=5)
button8f.grid(row=8, column=6)
button8g.grid(row=8, column=7)
button8h.grid(row=8, column=8)
button8i.grid(row=8, column=9)
button8j.grid(row=8, column=10)
button9a.grid(row=9, column=1)
button9b.grid(row=9, column=2)
button9c.grid(row=9, column=3)
button9d.grid(row=9, column=4)
button9e.grid(row=9, column=5)
button9f.grid(row=9, column=6)
button9g.grid(row=9, column=7)
button9h.grid(row=9, column=8)
button9i.grid(row=9, column=9)
button9j.grid(row=9, column=10)
button10a.grid(row=10, column=1)
button10b.grid(row=10, column=2)
button10c.grid(row=10, column=3)
button10d.grid(row=10, column=4)
button10e.grid(row=10, column=5)
button10f.grid(row=10, column=6)
button10g.grid(row=10, column=7)
button10h.grid(row=10, column=8)
button10i.grid(row=10, column=9)
button10j.grid(row=10, column=10)




root.mainloop()
 

Комментарии:

1. Держу пари, что использование списков и циклов помогло бы.

2. Создание доски на холсте из линий спрайтов было бы намного проще, чем все эти кнопки. Но вам все равно нужно будет использовать list s и for циклы, как указал @ FredLarson.

3. Привет, Лукас, добро пожаловать в сообщество. Обратите внимание, что ваш вопрос не имеет никакого отношения к tkinter и связан только с python.

Ответ №1:

Использование цикла может помочь вам:

 for i in range(10):
    for j in range(10):
        btn = Button(root, text="", padx=20, pady=10, command=buttonClick)
        btn.grid(row=i 1, column=j 1)
 

Если вам понадобятся кнопки позже, поместите их в список или, еще лучше, во вложенный список, чтобы вы могли ссылаться аналогично сетке 10×10

Ответ №2:

Вот модифицированный производитель шахматных досок. Я просто внесу небольшое изменение.

 import tkinter as tk


class Board:
    def __init__(self):
        self.root = tk.Tk()
        self.root.resizable(False, False)

        self.matrix = []
        c = ("white", "black")
        cell_colour = True
        for y in range(10):
            for x in range(10):
                button = tk.Button(self.root, width=3, fg=c[not cell_colour],
                                   bg=c[cell_colour], activebackground="red")
                self.matrix.append(button)
                button.grid(row=x, column=y, sticky="news")
                cell_colour = not cell_colour
            cell_colour = not cell_colour
        
    def mainloop(self) -> None:
        self.root.mainloop()
    
chess = Board()
chess.mainloop()
 

Вот он с подключенными кнопками buttonClick , который отслеживает, какая кнопка была нажата, а также имеет активные цвета.

 
import tkinter as tk

class board:

    matrix = [ ]
    c = ['white', 'black']
    d = ['yellow', 'red' ]

    def route( self, n ):
        return lambda: self.buttonClick( n )

    def __init__( self ):
        self.master = tk.Tk()
        self.master.withdraw()
        self.master.update_idletasks()
        self.build( 1 )
        self.master.resizable( False, False )
        self.master.deiconify()

    def build( self, w ):
        for y in range( 10 ):
            for x in range( 10 ):
                button = tk.Button(
                    self.master, width = 9, height = 3,
                    foreground = self.c[w], background = self.c[1-w],
                    activeforeground = self.d[w], activebackground = self.d[1-w],
                    command = self.route( x*10 y ) )
                button.grid( row=x, column=y, sticky='nsew')
                self.matrix.append( button )
                w = 1-w
            w = 1-w

    def buttonClick( self, n ):
        print( n )
    
game = board( )
tk.mainloop()
 

Комментарии:

1. @TheLizzard ах, ты меня опередил:)

2. :D. Кроме того, шахматные доски размером 8х8, а не 10х10, поэтому называть Board класс chess не лучшей идеей. Я забыл это изменить.

3. @TheLizzard да, я написал это изначально для Visual python около 8 лет назад.