Я читаю последовательные данные и пишу в 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.
python
while-loop
break
Крис
источник
источник
^C
выдается во время работыdo_something()
. Как этого избежать?do_something()
считывает некоторые значения с USB-накопителя, поэтому, если^C
выдается, когда я внутри,do_something()
я получаю неприятные ошибки связи. Вместо этого, если я внутриwhile
, за пределамиdo_something()
, все идет гладко. Итак, мне было интересно, как справиться с этой ситуацией. Я не уверен, что достаточно ясно выразился.pyVISA
и звонокmatplotlib
, чтобы я мог визуализировать свои измерения в реальном времени. И иногда я получаю фанковые ошибки. Думаю, мне следует открыть отдельный вопрос и перестатьЕсть решение, которое не требует нестандартных модулей и на 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()
источник
thread
->_thread
иraw_input
->input
. Вы должны нажать Enter, чтобы заполнить строку. Если хотите делать по любой клавише, используйте getch .у меня работает следующий код. Требуется openCV (импорт cv2).
Код состоит из бесконечного цикла, который постоянно ищет нажатую клавишу. В этом случае при нажатии клавиши «q» программа завершается. Можно нажимать другие клавиши (в этом примере «b» или «k») для выполнения различных действий, таких как изменение значения переменной или выполнение функции.
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 ...
источник
Для Python 3.7 я скопировал и изменил очень хороший ответ user297171, поэтому он работает во всех тестируемых мной сценариях Python 3.7.
import threading as th keep_going = True def key_capture_thread(): global keep_going input() keep_going = False def do_stuff(): th.Thread(target=key_capture_thread, args=(), name='key_capture_thread', daemon=True).start() while keep_going: print('still going...') do_stuff()
источник
pyHook может помочь. http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4
См. Крючки для клавиатуры; это более общий характер - если вам нужны определенные взаимодействия с клавиатурой, а не просто использование KeyboardInterrupt.
Кроме того, в целом (в зависимости от вашего использования) я думаю, что опция Ctrl-C, по-прежнему доступная для уничтожения вашего скрипта, имеет смысл.
См. Также предыдущий вопрос: определить в python, какие клавиши нажаты
источник
Всегда есть
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()
источник
raw_input
заменен наinput
Я изменил ответ от rayzinnz, чтобы завершить скрипт с помощью определенного ключа, в данном случае клавиши выхода
import threading as th import time import keyboard keep_going = True def key_capture_thread(): global keep_going a = keyboard.read_key() if a== "esc": keep_going = False def do_stuff(): th.Thread(target=key_capture_thread, args=(), name='key_capture_thread', daemon=True).start() i=0 while keep_going: print('still going...') time.sleep(1) i=i+1 print (i) print ("Schleife beendet") do_stuff()
источник
Следуя этой теме по кроличьей норе, я пришел к этому, работает на Win10 и Ubuntu 20.04. Я хотел большего, чем просто убить скрипт и использовать определенные ключи, и он должен был работать как в MS, так и в Linux ..
import _thread import time import sys import os class _Getch: """Gets a single character from standard input. Does not echo to the screen.""" def __init__(self): try: self.impl = _GetchWindows() except ImportError: self.impl = _GetchUnix() def __call__(self): return self.impl() class _GetchUnix: def __init__(self): import tty, sys def __call__(self): import sys, tty, termios fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch class _GetchWindows: def __init__(self): import msvcrt def __call__(self): import msvcrt msvcrt_char = msvcrt.getch() return msvcrt_char.decode("utf-8") def input_thread(key_press_list): char = 'x' while char != 'q': #dont keep doing this after trying to quit, or 'stty sane' wont work time.sleep(0.05) getch = _Getch() char = getch.impl() pprint("getch: "+ str(char)) key_press_list.append(char) def quitScript(): pprint("QUITTING...") time.sleep(0.2) #wait for the thread to die os.system('stty sane') sys.exit() def pprint(string_to_print): #terminal is in raw mode so we need to append \r\n print(string_to_print, end="\r\n") def main(): key_press_list = [] _thread.start_new_thread(input_thread, (key_press_list,)) while True: #do your things here pprint("tick") time.sleep(0.5) if key_press_list == ['q']: key_press_list.clear() quitScript() elif key_press_list == ['j']: key_press_list.clear() pprint("knock knock..") elif key_press_list: key_press_list.clear() main()
источник
Это может быть полезно для установки pynput с помощью - pip install pynput
from pynput.keyboard import Key, Listener def on_release(key): if key == Key.esc: # Stop listener return False # Collect events until released while True: with Listener( on_release=on_release) as listener: listener.join() break
источник
Это решение, которое я нашел с потоками и стандартными библиотеками.
Цикл продолжается, пока не будет нажата одна клавиша.
Возвращает нажатую клавишу как односимвольную строку.
Работает в Python 2.7 и 3.
import thread import sys def getch(): import termios import sys, tty def _getch(): fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(fd) ch = sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch return _getch() def input_thread(char): char.append(getch()) def do_stuff(): char = [] thread.start_new_thread(input_thread, (char,)) i = 0 while not char : i += 1 print "i = " + str(i) + " char : " + str(char[0]) do_stuff()
источник
import keyboard while True: print('please say yes') if keyboard.is_pressed('y'): break print('i got u :) ') print('i was trying to write you are a idiot ') print(' :( ')
для входа используйте 'ENTER'
источник