Saya membaca data serial dan menulis ke file csv menggunakan loop sementara. Saya ingin pengguna dapat menghentikan while loop setelah mereka merasa telah mengumpulkan cukup data.
while True:
#do a bunch of serial stuff
#if the user presses the 'esc' or 'return' key:
break
Saya telah melakukan sesuatu seperti ini menggunakan opencv, tetapi tampaknya tidak berfungsi di aplikasi ini (dan saya benar-benar tidak ingin mengimpor opencv hanya untuk fungsi ini) ...
# Listen for ESC or ENTER key
c = cv.WaitKey(7) % 0x100
if c == 27 or c == 10:
break
Begitu. Bagaimana cara membiarkan pengguna keluar dari loop?
Juga, saya tidak ingin menggunakan interupsi keyboard, karena skrip harus terus berjalan setelah loop sementara dihentikan.
python
while-loop
break
Chris
sumber
sumber
^C
dikeluarkan saat masukdo_something()
. Bagaimana Anda bisa menghindari ini?do_something()
membaca beberapa nilai dari USB, jadi, jika^C
dikeluarkan saat saya di dalam,do_something()
saya mendapatkan kesalahan komunikasi yang parah. Sebaliknya, jika saya di dalamwhile
, di luardo_something()
, semuanya lancar. Jadi, saya bertanya-tanya bagaimana menangani situasi ini. Saya tidak yakin saya telah membuat diri saya cukup jelas.pyVISA
dan panggilanmatplotlib
, sehingga saya dapat memiliki visualisasi langsung dari pengukuran saya. Dan terkadang saya mendapatkan kesalahan yang funky. Saya pikir saya harus membuka pertanyaan terpisah dan berhenti mencemari jawaban Anda ...Ada solusi yang tidak memerlukan modul non-standar dan 100% dapat dipindahkan
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()
sumber
thread
->_thread
danraw_input
->input
. Anda harus menekan enter untuk memberi makan baris. Jika Anda ingin melakukan pada tombol apa saja, gunakan getch .kode berikut berfungsi untuk saya. Ini membutuhkan openCV (impor cv2).
Kode ini terdiri dari loop tak terbatas yang terus mencari tombol yang ditekan. Dalam kasus ini, ketika tombol 'q' ditekan, program berakhir. Tombol lain dapat ditekan (dalam contoh ini 'b' atau 'k') untuk melakukan berbagai tindakan seperti mengubah nilai variabel atau menjalankan fungsi.
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 ...
sumber
Untuk Python 3.7, saya menyalin dan mengubah jawaban yang sangat bagus oleh user297171 sehingga berfungsi di semua skenario di Python 3.7 yang saya uji.
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()
sumber
pyHook mungkin membantu. http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4
Lihat kait keyboard; ini lebih digeneralisasikan - jika Anda menginginkan interaksi keyboard tertentu dan tidak hanya menggunakan KeyboardInterrupt.
Juga, secara umum (tergantung pada penggunaan Anda) saya pikir memiliki opsi Ctrl-C masih tersedia untuk mematikan skrip Anda masuk akal.
Lihat juga pertanyaan sebelumnya: Mendeteksi dengan python tombol mana yang ditekan
sumber
Selalu ada
sys.exit()
.Pustaka sistem di pustaka inti Python memiliki fungsi keluar yang sangat berguna saat membuat prototipe. Kode tersebut akan berada di sepanjang baris:
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()
sumber
raw_input
digantikan olehinput
Saya memodifikasi jawaban dari rayzinnz untuk mengakhiri skrip dengan kunci tertentu, dalam hal ini kunci pelarian
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()
sumber
Dari mengikuti utas ini ke lubang kelinci, saya sampai pada ini, berfungsi pada Win10 dan Ubuntu 20.04. Saya ingin lebih dari sekadar mematikan skrip, dan menggunakan kunci tertentu, dan itu harus berfungsi di MS dan 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()
sumber
Ini mungkin berguna untuk menginstal pynput dengan - 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
sumber
Ini adalah solusi yang saya temukan dengan utas dan pustaka standar
Loop terus berlanjut sampai satu tombol ditekan
Mengembalikan tombol yang ditekan sebagai string karakter tunggal
Bekerja dengan Python 2.7 dan 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()
sumber
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(' :( ')
untuk masuk gunakan 'ENTER'
sumber