Сапёр на tkinter, ошибка с вызовом нажатия кнопки

Skatoro

Новичок
Пользователь
Дек 26, 2020
7
0
1
Windows 10, Python 3.9

При нажатии лкм, показывается количество бомб в соседних клеточках, если при нажатии на кнопку, возле нее не окажется мин, нужно сделать так, чтобы на все соседние кнопки использовалась команда нажатия левой кнопки мыши, но у меня выдает ошибку, как это решить? Моя попытка в строке 48 не сработала. (Выбирайте любой уровень сложности и сохранение не вписывая логин и пароль)

 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Моя попытка в строке 48 не сработала.
Потому что кнопка это не функция, а объект.
Чтобы ее нажать программно можно использовать метод button.invoke() или просто вызвать функцию, привязанную к нажатию на кнопку.
Также если не проверять была кнопка нажата или нет, а просто нажимать на все соседние кнопки - программа впадет в рекурсию и завершится достигнув предела рекурсии.
Это можно увидеть заменив эту строку
Python:
btn[y_item][x_item]('<Button-1>')
на такую
Python:
btn[y_item][x_item].invoke()
Чтобы не возникало рекурсии можно задать каждой кнопке флаг, определяющий была ли она нажата и перед нажатием проверять его (чтобы не нажимать кнопку повторно и не вызывать рекурсию).
Флаг можно задать при создании кнопок в функции gamestart:
Python:
def gamestart(v):
    ...
    btn = [[0 for i in range(width)] for j in range(height)]
    for i in range(height):
        for j in range(width):
            btn[i][j] = Button(
                text="   ",
                bg="#9ACD32",
                command=lambda y=i, x=j, countdown=q: lbtn_click(
                    x, y, width, height, countdown, btn
                ),
            )
            btn[i][j].flag = False  # задаем флаг для кнопки (False - не нажата)
            btn[i][j].bind("<Button-3>", rbtn_click)
            btn[i][j].grid(row=i, column=j, ipady=10, ipadx=13)
    ...
и потом в функции bombcount автоматически нажимать только кнопки у которых flag == False.
Для этого нужно заменить строку
Python:
btn[y_item][x_item]('<Button-1>')
на такие строки
Python:
if not btn[y_item][x_item].flag:  # проверяем что кнопка не нажата
    btn[y_item][x_item].flag = True  # меняем флаг
    btn[y_item][x_item].invoke()  # нажимаем на кнопку
 
  • Мне нравится
Реакции: Skatoro

Skatoro

Новичок
Пользователь
Дек 26, 2020
7
0
1
Потому что кнопка это не функция, а объект.
Чтобы ее нажать программно можно использовать метод button.invoke() или просто вызвать функцию, привязанную к нажатию на кнопку.
Также если не проверять была кнопка нажата или нет, а просто нажимать на все соседние кнопки - программа впадет в рекурсию и завершится достигнув предела рекурсии.
Это можно увидеть заменив эту строку
Python:
btn[y_item][x_item]('<Button-1>')
на такую
Python:
btn[y_item][x_item].invoke()
Чтобы не возникало рекурсии можно задать каждой кнопке флаг, определяющий была ли она нажата и перед нажатием проверять его (чтобы не нажимать кнопку повторно и не вызывать рекурсию).
Флаг можно задать при создании кнопок в функции gamestart:
Python:
def gamestart(v):
    ...
    btn = [[0 for i in range(width)] for j in range(height)]
    for i in range(height):
        for j in range(width):
            btn[i][j] = Button(
                text="   ",
                bg="#9ACD32",
                command=lambda y=i, x=j, countdown=q: lbtn_click(
                    x, y, width, height, countdown, btn
                ),
            )
            btn[i][j].flag = False  # задаем флаг для кнопки (False - не нажата)
            btn[i][j].bind("<Button-3>", rbtn_click)
            btn[i][j].grid(row=i, column=j, ipady=10, ipadx=13)
    ...
и потом в функции bombcount автоматически нажимать только кнопки у которых flag == False.
Для этого нужно заменить строку
Python:
btn[y_item][x_item]('<Button-1>')
на такие строки
Python:
if not btn[y_item][x_item].flag:  # проверяем что кнопка не нажата
    btn[y_item][x_item].flag = True  # меняем флаг
    btn[y_item][x_item].invoke()  # нажимаем на кнопку
Спасибо большое
 

Форум IT Специалистов