首頁 > 軟體

Python input輸入超時選擇預設值自動跳過問題

2023-02-24 06:01:37

Python input 等待鍵盤輸入,超時選擇預設值,釋放input,之後重新進入等待鍵盤輸入狀態,直到使用者輸入可用資料。

一、呼叫 func_timeout 模組實現超時控制

1、安裝 func_timeout 庫

pip install func_timeout

2、使用 func_timeout 庫

func_set_timeout 裝飾器設定超時時間,程式超時後會丟擲func_timeout.exceptions.FunctionTimedOut異常

import func_timeout

@func_timeout.func_set_timeout(3)  #超時時間為 3s
def Input_task():
    print('請輸入:')
    return input()

3、使用 try…except 捕捉異常

def task():
    try:
        s = Input_task()
        print('成功輸入')
    except func_timeout.exceptions.FunctionTimedOut as e:
        s = '預設值!'
    print(s)

4、問題

下面的程式碼中將 task() 函數放進 while 迴圈,出現超時異常後,手動輸入無效

import func_timeout
from func_timeout import func_set_timeout

timeout = 4
@func_set_timeout(timeout)
def Input_task():
    print('請輸入:')
    return input()

def task():
    try:
        s = Input_task()
        print('成功輸入')
        run_flag = False
    except func_timeout.exceptions.FunctionTimedOut as e:
        s = '預設值!'
        run_flag = True
    print(s)
    return run_flag   #如果成功輸入將退出 while 迴圈

run_flag = True
while run_flag:
    run_flag = task()

執行結果:

小結:該模組只能進行一次超時控制,當程式第一次丟擲超時異常後,即使使用者輸入資料也無濟於事

二、使用 Timer 定時器和模擬鍵盤輸入實現超時控制

1、Timet 定時器

是Thead類的一個子類,可用於在指定時間間隔後啟動執行緒

# 匯入執行緒模組
import threading
 
timer = threading.Timer(interval, function, args=None, kwargs=None)

引數介紹:

  • interval — 定時器間隔,間隔多少秒之後啟動定時器任務(單位:秒);
  • function — 執行緒函數;
  • args — 執行緒引數,可以傳遞元組型別資料,預設為空(預設引數);
  • kwargs — 執行緒引數,可以傳遞字典型別資料,預設為空(預設引數)

2、模擬鍵盤輸入

(1) PyUserInput模組安裝

pip install PyUserInput

python3.5的PyMouse和PyKeyboard模組都整合到了PyUserInput模組中

(2) 鍵盤範例化

from pykeyboard import PyKeyboard

k = PyKeyboard()#鍵盤的範例 k

(3) 鍵盤操作說明

單個按鍵

k.type_string(‘Hello, World!')	#模擬鍵盤輸入字串
k.press_key(‘H')	#模擬鍵盤按H鍵
k.release_key(‘H')	#模擬鍵盤松開H鍵
k.tap_key(「H」)	#模擬點選H鍵
k.tap_key(‘H',n=2,interval=5)	#模擬點選H鍵,2次,每次間隔5秒
k.tap_key(k.function_keys[5])	#點選功能鍵F5
k.tap_key(k.numpad_keys[5],3)	#點選小鍵盤5,3次

組合鍵(例如同時按alt+tab鍵盤 )

k.press_key(k.alt_key)	#按住alt鍵
k.tap_key(k.tab_key)	#點選tab鍵
k.release_key(k.alt_key)	#鬆開alt鍵

3、程式碼實現

from pykeyboard import PyKeyboard
import threading

def Input_simulate(timeout):
    if not Input_event.is_set():    
        key = PyKeyboard()#鍵盤的範例 key
        key.type_string('no input')  #模擬鍵盤輸入字串
        key.press_key(key.enter_key)  #模擬按下 ENTER 鍵
        key.release_key(key.enter_key)  #模擬釋放 ENTER 鍵

    global timer  #將定時器的控制程式碼定義成一個全域性變數,這樣做的好處是,建立的定時器程序和範例不會堆積,而是覆蓋,避免不必要的記憶體佔用。
    Input_event.clear()
    timer = threading.Timer(timeout, Input_simulate, args=(timeout,))
    timer.start()
    msg = input('請輸入你的資訊:')
    if msg == 'no input':
        pass
    else:
        print(msg)    #列印輸入資訊
        timer.cancel()  #取消定時器的排程,當用戶輸入資料時將停止計時,程式退出執行

if __name__ == '__main__':
    Input_event = threading.Event()
    Input_event.set()
    Input_simulate(5)

執行結果:

小結:該程式碼等待鍵盤輸入,超時選擇預設值,釋放input,之後重新進入等待鍵盤輸入狀態,直到使用者輸入可用資料。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com