Как прервать gech() в python?

У меня есть 3 активных потока. Один из них активирует другой Thread и использует getch() для обнаружения клавиши ESC, при нажатии на которую программа закрывается.

Когда два других потока завершают свою работу (без нажатия клавиши ESC), они успешно закрываются, но первый поток все еще ожидает нажатия клавиши ESC. Таким образом, программа все еще работает.

class tracking():
def __init__(self):    
    self.tecla = '\x1b' #ESC
    self.case = None

def pressed(self, case):
    self.case = getch()

def inicio(self): #The Thread in question calls this function
    Thread(target=self.pressed(self.case)).start()      
    while True:
        if self.case is not None:
            if self.case == self.tecla:
                sys.exit()
            else:
                self.case = None
                self.pressed(self.case)

person Community    schedule 08.03.2018    source источник


Ответы (1)


Это потому, что getch() является синхронным. Есть несколько вариантов:

  • Вы можете select ждать операции ввода-вывода (включая клавиатуру), см. здесь: https://docs.python.org/2/library/select.html

  • Вы можете использовать библиотеку, которая позволяет вам обнаруживать нажатия клавиш, а затем зацикливаться и ждать, пока вы их не получите. Это может быть громоздко, если вы используете что-то вроде, скажем, pygame.

  • Вы можете разорвать поток самостоятельно, используя thread.interrupt_main , см. здесь: https://docs.python.org/2/library/thread.html#thread.interrupt_main

person ChatterOne    schedule 08.03.2018