fgjgf

В этой программе игровое поле из Button объектов создадим по шаблону, разработанному в статье Игровое поле из Button. Только изменим количество кнопок (переменные column и row).

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок

def play(n):                        # функция обработчик нажатия на кнопку
    btn[n].config(text = n)

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 1.

Рис. 1.

В программе листинг 1, в функции play(), закомментируем строку

btn[n].config(text = n)

и объявим в функции play() глобальную переменную m.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок

def play(n):                        # функция обработчик нажатия на кнопку
    global m
    # btn[n].config(text = n)

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 2.

Добавим в программу листинг 2 список letter и перемешаем его элементы.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)

def play(n):                        # функция обработчик нажатия на кнопку
    global m
    # btn[n].config(text = n)

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 3.

В программе листинг 3, в функции play(), раскомментируем строку

btn[n].config(text = n)

и немного изменим её.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)

def play(n):                        # функция обработчик нажатия на кнопку
    global m
    btn[n].config(text=letter[n])

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 4.

Рис. 2.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
m = 0

def play(n):                        # функция обработчик нажатия на кнопку
    global m
    btn[n].config(text=letter[n])
    btn[m].config(text=" ")
    m = n

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 5.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0

def play(n):                        # функция обработчик нажатия на кнопку
    global m, fix
    btn[n].config(text=letter[n])
    if fix:
        fix = False
    else:
        btn[m].config(text=" ")
    m = n

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 6.

Изменения, внесённые в программу листинг 6 позволяют нам удалить строку

m = 0

Теперь добавим в функцию play() условный оператор elif и логическую операцию, которая будет сравнивать букву на нажатой кнопке с ранее открытой буквой.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0

def play(n):                        # функция обработчик нажатия на кнопку
    global m, fix
    btn[n].config(text=letter[n])
    if fix:
        fix = False
    elif letter[n] == letter[m]:
        fix = True
    else:
        btn[m].config(text=" ")
    m = n

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 7.

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

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0

def play(n):                        # функция обработчик нажатия на кнопку
    global m, fix
    if btn[n].cget('text') != " " : return
    btn[n].config(text=letter[n])
    if fix:
        fix = False
    elif letter[n] == letter[m]:
        fix = True
    else:
        btn[m].config(text=" ")
    m = n

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 8.

#!/usr/bin/env python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- 
#
# Memory.py
# Copyright (C) 2022 Aleksandr Diorditsa, see <https://adior.ru>
# I want to thank all my students for the inspiration they give me.
#
# Memory.py is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# 
# Memory.py is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License along
# with this program.  If not, see <http://www.gnu.org/licenses/>.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)

column = 8                          # столбцы
row = 6                             # строки
btn = []                            # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0

def play(n):                        # функция обработчик нажатия на кнопку
    global m, fix
    if btn[n].cget('text') != " " : return
    btn[n].config(text=letter[n])
    if fix:
        fix = False
    elif letter[n] == letter[m]:
        fix = True
    else:
        btn[m].config(text=" ")
    m = n

for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))

mainloop()

Лист. 9.

Рис. 2. Изображения шариков в png формате.

Рис. Прозрачное изображение размером 50х50 px.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
 
column = 7                          # столбцы
row = 4                             # строки
btn = []                            # список кнопок
img = []
files = ['red.png', 'yellow.png', 'gold.png',
         'green.png', 'emerald.png', 'cyan.png',
         'blue.png', 'pink.png','azure.png',
         'bronze.png', 'purple.png', 'scarlet.png',
         'steel.png', 'silver.png']*2
shuffle(files)
fix = True
m = 0
 
def play(n):                        # функция обработчик нажатия на кнопку
    global m, fix
    #print(btn[n].cget('image'))
    if btn[n].cget('image') != 'pyimage1' : return
    btn[n].config(image = img[n])
    if fix:
        fix = False
    elif files[n] == files[m]:
        fix = True
    else:
        btn[m].config(image = imgBL)
    m = n
 
tk = Tk()
imgBL = PhotoImage(file="blank.png")
for i in files:
    img += [PhotoImage(file=i)]
 
for i in range(row):
    f = Frame()
    f.pack(expand=YES, fill=BOTH)
    for j in range(column):
        btn += [Button(f, image=imgBL)]
        btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[-1].config(command=lambda n=i*column+j:play(n))
 
mainloop()

Ррп