Lặp qua python đầu vào

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ày

Nộ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ập

import 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

Chủ Đề