Tôi có một vòng lặp vô hạn mà tôi muốn thoát ra khi người dùng nhấn một phím. Thông thường tôi sử dụng
import sys
import os
import fcntl
import time
fl = fcntl.fcntl[sys.stdin.fileno[], fcntl.F_GETFL]
fcntl.fcntl[sys.stdin.fileno[], fcntl.F_SETFL, fl | os.O_NONBLOCK]
while True:
print["Waiting for user input"]
try:
stdin = sys.stdin.read[]
if "\n" in stdin or "\r" in stdin:
break
except IOError:
pass
time.sleep[1]
0 để nhận phản hồi của người dùng; . tôi muốn một cái gì đó như thế nàyNội dung chính Hiển thị
- Làm thế nào để bạn kết thúc một vòng lặp trong Python?
- Chúng ta có thể lấy đầu vào trong vòng lặp while trong Python không?
- Làm thế nào để bạn kết thúc một vòng lặp trong Python bằng phép lặp?
print 'Press enter to continue.'
while True:
# Do stuff
#
# User pressed enter, break out of loop
Điều này sẽ đơn giản, nhưng tôi dường như không thể tìm ra nó. Tôi đang hướng tới một giải pháp sử dụng luồng, nhưng tôi không muốn phải làm điều đó. Làm thế nào tôi có thể thực hiện điều này?
đã hỏi 13/12/2013 lúc 22. 16
7
Bạn có thể sử dụng đọc không chặn từ stdin
import sys
import os
import fcntl
import time
fl = fcntl.fcntl[sys.stdin.fileno[], fcntl.F_GETFL]
fcntl.fcntl[sys.stdin.fileno[], fcntl.F_SETFL, fl | os.O_NONBLOCK]
while True:
print["Waiting for user input"]
try:
stdin = sys.stdin.read[]
if "\n" in stdin or "\r" in stdin:
break
except IOError:
pass
time.sleep[1]
đã trả lời 13/12/2013 lúc 22. 43
1
Tôi nghĩ bạn có thể làm tốt hơn với msvcrt
import msvcrt, time
i = 0
while True:
i = i + 1
if msvcrt.kbhit[]:
if msvcrt.getwche[] == '\r':
break
time.sleep[0.1]
print[i]
Đáng buồn thay, vẫn dành riêng cho cửa sổ
đã trả lời 13/12/2013 lúc 22. 49
octref octref
6.3636 huy hiệu vàng27 huy hiệu bạc42 huy hiệu đồng
Trên con trăn 3. 5 bạn có thể sử dụng đoạn mã sau. Nó có thể được điều chỉnh cho một tổ hợp phím cụ thể. Vòng lặp while sẽ tiếp tục chạy cho đến khi người dùng nhấn một phím
import time
import threading
# set global variable flag
flag = 1
def normal[]:
global flag
while flag==1:
print['normal stuff']
time.sleep[2]
if flag==False:
print['The while loop is now closing']
def get_input[]:
global flag
keystrk=input['Press a key \n']
# thread doesn't continue until key is pressed
print['You pressed: ', keystrk]
flag=False
print['flag is now:', flag]
n=threading.Thread[target=normal]
i=threading.Thread[target=get_input]
n.start[]
i.start[]
đã trả lời 28/11/2017 ở 20. 43
gtcoder gtcoder
1412 huy hiệu bạc6 huy hiệu đồng
Tôi không thể làm cho một số câu trả lời phổ biến hoạt động. Vì vậy, tôi đã nghĩ ra một cách tiếp cận khác bằng cách sử dụng
import sys
import os
import fcntl
import time
fl = fcntl.fcntl[sys.stdin.fileno[], fcntl.F_GETFL]
fcntl.fcntl[sys.stdin.fileno[], fcntl.F_SETFL, fl | os.O_NONBLOCK]
while True:
print["Waiting for user input"]
try:
stdin = sys.stdin.read[]
if "\n" in stdin or "\r" in stdin:
break
except IOError:
pass
time.sleep[1]
0 + import sys
import os
import fcntl
import time
fl = fcntl.fcntl[sys.stdin.fileno[], fcntl.F_GETFL]
fcntl.fcntl[sys.stdin.fileno[], fcntl.F_SETFL, fl | os.O_NONBLOCK]
while True:
print["Waiting for user input"]
try:
stdin = sys.stdin.read[]
if "\n" in stdin or "\r" in stdin:
break
except IOError:
pass
time.sleep[1]
1 để cắm đầu vào của người dùng và hấp thụ ngắt bàn phím. Một giải pháp đơn giản có thể là sử dụng khối try-catch,i = 0
try:
while True:
i+=1
print[i]
sleep[1]
except:
pass
# do what you want to do after it...
Tôi có ý tưởng này từ việc chạy một số máy chủ như bình và django. Điều này có thể hơi khác so với những gì OP đã hỏi, nhưng nó có thể giúp ích cho người khác muốn điều tương tự
đã trả lời 2 tháng 2 năm 2019 lúc 5. 47
lu5er lu5er
2.9902 huy hiệu vàng25 huy hiệu bạc48 huy hiệu đồng
Những gì bạn cần là đầu vào thô không chặn, nếu bạn không muốn sử dụng các luồng, có một giải pháp đơn giản như giải pháp này bên dưới, nơi anh ấy đang thực hiện thời gian chờ là 20 ms, sau đó tăng và ngoại lệ nếu người dùng không nhấn
import signal
class AlarmException[Exception]:
pass
def alarmHandler[signum, frame]:
raise AlarmException
def nonBlockingRawInput[prompt='', timeout=20]:
signal.signal[signal.SIGALRM, alarmHandler]
signal.alarm[timeout]
try:
text = raw_input[prompt]
signal.alarm[0]
return text
except AlarmException:
print '\nPrompt timeout. Continuing...'
signal.signal[signal.SIGALRM, signal.SIG_IGN]
return ''
Mã nguồn
đã trả lời 13/12/2013 lúc 22. 44
moisesvega moisesvega
4251 huy hiệu vàng5 huy hiệu bạc16 huy hiệu đồng
Sử dụng mô-đun
import sys
import os
import fcntl
import time
fl = fcntl.fcntl[sys.stdin.fileno[], fcntl.F_GETFL]
fcntl.fcntl[sys.stdin.fileno[], fcntl.F_SETFL, fl | os.O_NONBLOCK]
while True:
print["Waiting for user input"]
try:
stdin = sys.stdin.read[]
if "\n" in stdin or "\r" in stdin:
break
except IOError:
pass
time.sleep[1]
2 như thebjorn đề xuất, tôi đã có thể nghĩ ra thứ gì đó hiệu quả. Sau đây là một ví dụ cơ bản sẽ thoát khỏi vòng lặp nếu nhấn bất kỳ phím nào, không chỉ nhậpimport msvcrt, time
i = 0
while True:
i = i + 1
if msvcrt.kbhit[]:
break
time.sleep[0.1]
print i
đã trả lời 13/12/2013 lúc 22. 32
Tôi đã định nghĩa hàm yêu cầu nhập số từ người dùng và trả về giai thừa của số đó. Nếu người dùng muốn dừng, họ phải nhấn 0 và sau đó nó sẽ thoát khỏi vòng lặp. Chúng tôi có thể chỉ định bất kỳ khóa cụ thể nào để nhập 'n' để thoát khỏi vòng lặp