Как убить цикл while нажатием клавиши?

Я читаю последовательные данные и записываю в CSV-файл, используя цикл while. Я хочу, чтобы пользователь мог завершить цикл while, когда почувствует, что собрал достаточно данных.

while True:
    #do a bunch of serial stuff

    #if the user presses the 'esc' or 'return' key:
        break

Я сделал что-то вроде этого с помощью OpenCV, но это некажется, работает в этом приложении (и я действительно нев любом случае я не хочу импортировать opencv только для этой функции) ...

        # Listen for ESC or ENTER key
        c = cv.WaitKey(7) % 0x100
        if c == 27 or c == 10:
            break

Так. Как я могу позволить пользователю вырваться из цикла?

Кроме того, я неЯ не хочу использовать прерывание клавиатуры, потому что скрипт должен продолжать работать после завершения цикла while.

Ответы на вопрос(5)

Решение Вопроса

Самый простой способ - просто прервать его обычнымCtrl-C (SIGINT).

try:
    while True:
        do_something()
except KeyboardInterrupt:
    pass

посколькуCtrl-C причиныKeyboardInterrupt чтобы быть поднятым, просто поймайте это вне петли и проигнорируйте это.

 Keith23 апр. 2016 г., 04:15
@ Atcold Что за ошибка? Какую ОС вы используете?
 SilentGhost01 нояб. 2012 г., 17:21
@ Крис: почему неты попробуй. (а затем комментарий)
 Atcold23 апр. 2016 г., 06:43
мойdo_something() читает некоторые значения с USB, так что если^C выдается в то время как ям внутриdo_something() Я получаю неприятные ошибки связи. Вместо этого, если ям вwhile, внеdo_something(), все гладко. Итак, мне было интересно, как справиться с этой ситуацией. Я'Я не уверен, что я достаточно ясно дал понять.
 Keith23 апр. 2016 г., 06:52
@ Atcold Итак, у вас есть скомпилированный модуль расширения, который выповторное использование. Что это за модуль? Оборачивается ли это обычная библиотека C?
 Atcold25 апр. 2016 г., 15:54
У меня есть звонокpyVISA и вызовmatplotlib, так что я могу иметь живую визуализацию моих измерений. И иногда я получаю прикольные ошибки. Я думаю, что я должен открыть отдельный вопрос и перестать загрязнять ваш ответ ...
 Atcold20 апр. 2016 г., 21:00
Это происходит сбой (я получаю сообщение об ошибке)^C выдается в то время как вdo_something(), Как вы можете избежать этого?

sys.exit()

Системная библиотека в Python'еВ базовой библиотеке есть функция выхода, которая очень удобна при создании прототипов. Код будет выглядеть следующим образом:

import sys

while True:
    selection = raw_input("U: Create User\nQ: Quit")
    if selection is "Q" or selection is "q":
        print("Quitting")
        sys.exit()
    if selection is "U" or selection is "u":
        print("User")
        #do_something()

Код состоит из бесконечного цикла, который непрерывно ищет нажатую клавишу. В этом случае, когда «д» клавиша нажата, программа заканчивается. Другие клавиши могут быть нажаты (в этом примере «б» или "к") выполнять различные действия, такие как изменение значения переменной или выполнение функции.

import cv2

while True:
    k = cv2.waitKey(1) & 0xFF
    # press 'q' to exit
    if k == ord('q'):
        break
    elif k == ord('b'):
        # change a variable / do something ...
    elif k == ord('k'):
        # change a variable / do something ...
 Talespin_Kit02 мар. 2019 г., 20:42
почему и с 255
 ogurets02 июн. 2017 г., 17:11
Хорошо, но cv2 слишком тяжел, если вы неуже использую его для чего-то другого.

которое не требует нестандартных модулей и является на 100% транспортабельным

import thread

def input_thread(a_list):
    raw_input()
    a_list.append(True)

def do_stuff():
    a_list = []
    thread.start_new_thread(input_thread, (a_list,))
    while not a_list:
        stuff()
 Artyer13 июн. 2017 г., 12:17
@ Просто так ->thread _thread и ->raw_input input, Вы должны нажать Enter, чтобы прокормить линию. Если вы хотите сделать на любой ключ, используйтеГеч.
 Towhid11 июн. 2017 г., 22:42
@Artyer Если я 'Я не ошибаюсь, все нажатия клавиш вызывают прерывания, поскольку они вызываются аппаратным обеспечением. работал ли этот код для вас, и если да, то внесли ли вы какие-либо конкретные изменения?
 Wieschie21 сент. 2016 г., 21:23
Просто замечание для тех, кто использует Python 3+: raw_input () был переименован в input (), а модуль потока теперь _thread.
 Artyer07 июн. 2017 г., 21:28
@ Таухид Но это неиспользовать прерывания. Он использует чтение из стандартного ввода.
 Towhid30 мар. 2017 г., 17:41
Didn»t работать в Python 3, в соответствии с документами Python 3: "Потоки странным образом взаимодействуют с прерываниями: исключение KeyboardInterrupt будет получено произвольным потоком. (Когда сигнальный модуль доступен, прерывания всегда идут в основной поток.) "

http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

См. Крючки клавиатуры; это более обобщенно - если вы хотите конкретные взаимодействия с клавиатурой, а не просто использование KeyboardInterrupt.

Кроме того, в целом (в зависимости от вашего использования) я думаю, что иметь опцию Ctrl-C, доступную для уничтожения вашего сценария, имеет смысл.

Смотрите также предыдущий вопрос:Определить в питоне, какие клавиши нажаты

Ваш ответ на вопрос