keyboard.wait() не дает остановить цикл while (Python). Помогите найти обходной путь

Рейтинг: 0Ответов: 0Опубликовано: 27.07.2023

Решил сделать известную игру "Сапер" на ЯП Python в консоли. Захотел сделать управление не вписыванием координат в input() для "копания", а клавишами клавиатуры(стрелочки, пробел и т.д.). Использовал для этого библиотеку keyboard для отслеживания нажатий. В процессе оказалось, что функция keyboard.wait() блокирует основной поток программы, и из-за этого не могу остановить цикл while, в котором и находится keyboard.wait().

Остановка цикла while является важным моментом программы, так как цикл является основным, и по его итогу игра завершается либо проигрышем, либо выигрышем.

Итак, вот пример этого цикла в коде программы:

def play(self):
    # Main game loop
    while self.main_loop:
        def on_press(key):
            # On key press, update the game state depending on the key pressed
            self.field[self.marker_y][self.marker_x] = self.prev_cell
            match key.name:
                # В зависимости от клавиши выполняет функцию
                # перемещения маркера, копания или ставит флажок.
                pass

            # Update the marker's position
            self.prev_cell = self.field[self.marker_y][self.marker_x]
            self.field[self.marker_y][self.marker_x] = self.marker_sign
            
            # Refresh the console and redraw the game field
            os.system('cls')
            self.draw()

        # НЕ ДАЕТ ОСТАНОВИТЬ ЦИКЛ
        keyboard.on_press(on_press)
        keyboard.wait()

Небольшое дополнение: если вписать break до keyboard.wait(), то программа остановится (что очевидно, ведь очередь не дойдет до исполнения ф-ии).

Мне нужно, чтобы при значении self.main_loop = False программа останавливалась. А так, игру можно остановить принудительно сочетанием Ctrl+C.

Со всем кодом можно ознакомится на github.

Ответы

Ответов пока нет.