Python?input輸入超時(shí)選擇默認(rèn)值自動(dòng)跳過問題
Python input 等待鍵盤輸入,超時(shí)選擇默認(rèn)值,釋放input,之后重新進(jìn)入等待鍵盤輸入狀態(tài),直到用戶輸入可用數(shù)據(jù)。
一、調(diào)用 func_timeout 模塊實(shí)現(xiàn)超時(shí)控制
1、安裝 func_timeout 庫
pip install func_timeout
2、使用 func_timeout 庫
func_set_timeout 裝飾器設(shè)置超時(shí)時(shí)間,程序超時(shí)后會(huì)拋出func_timeout.exceptions.FunctionTimedOut異常
import func_timeout
@func_timeout.func_set_timeout(3) #超時(shí)時(shí)間為 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 = '默認(rèn)值!'
print(s)
4、問題
下面的代碼中將 task() 函數(shù)放進(jìn) while 循環(huán),出現(xiàn)超時(shí)異常后,手動(dòng)輸入無效
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 = '默認(rèn)值!'
run_flag = True
print(s)
return run_flag #如果成功輸入將退出 while 循環(huán)
run_flag = True
while run_flag:
run_flag = task()
運(yùn)行結(jié)果:

小結(jié):該模塊只能進(jìn)行一次超時(shí)控制,當(dāng)程序第一次拋出超時(shí)異常后,即使用戶輸入數(shù)據(jù)也無濟(jì)于事
二、使用 Timer 定時(shí)器和模擬鍵盤輸入實(shí)現(xiàn)超時(shí)控制
1、Timet 定時(shí)器
是Thead類的一個(gè)子類,可用于在指定時(shí)間間隔后啟動(dòng)線程
# 導(dǎo)入線程模塊 import threading timer = threading.Timer(interval, function, args=None, kwargs=None)
參數(shù)介紹:
interval— 定時(shí)器間隔,間隔多少秒之后啟動(dòng)定時(shí)器任務(wù)(單位:秒);function— 線程函數(shù);args— 線程參數(shù),可以傳遞元組類型數(shù)據(jù),默認(rèn)為空(缺省參數(shù));kwargs— 線程參數(shù),可以傳遞字典類型數(shù)據(jù),默認(rèn)為空(缺省參數(shù))
2、模擬鍵盤輸入
(1) PyUserInput模塊安裝
pip install PyUserInput
python3.5的PyMouse和PyKeyboard模塊都集成到了PyUserInput模塊中
(2) 鍵盤實(shí)例化
from pykeyboard import PyKeyboard k = PyKeyboard()#鍵盤的實(shí)例 k
(3) 鍵盤操作說明
單個(gè)按鍵
k.type_string(‘Hello, World!') #模擬鍵盤輸入字符串 k.press_key(‘H') #模擬鍵盤按H鍵 k.release_key(‘H') #模擬鍵盤松開H鍵 k.tap_key(“H”) #模擬點(diǎn)擊H鍵 k.tap_key(‘H',n=2,interval=5) #模擬點(diǎn)擊H鍵,2次,每次間隔5秒 k.tap_key(k.function_keys[5]) #點(diǎn)擊功能鍵F5 k.tap_key(k.numpad_keys[5],3) #點(diǎn)擊小鍵盤5,3次
組合鍵(例如同時(shí)按alt+tab鍵盤 )
k.press_key(k.alt_key) #按住alt鍵 k.tap_key(k.tab_key) #點(diǎn)擊tab鍵 k.release_key(k.alt_key) #松開alt鍵
3、代碼實(shí)現(xiàn)
from pykeyboard import PyKeyboard
import threading
def Input_simulate(timeout):
if not Input_event.is_set():
key = PyKeyboard()#鍵盤的實(shí)例 key
key.type_string('no input') #模擬鍵盤輸入字符串
key.press_key(key.enter_key) #模擬按下 ENTER 鍵
key.release_key(key.enter_key) #模擬釋放 ENTER 鍵
global timer #將定時(shí)器的句柄定義成一個(gè)全局變量,這樣做的好處是,創(chuàng)建的定時(shí)器進(jìn)程和實(shí)例不會(huì)堆積,而是覆蓋,避免不必要的內(nèi)存占用。
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() #取消定時(shí)器的調(diào)度,當(dāng)用戶輸入數(shù)據(jù)時(shí)將停止計(jì)時(shí),程序退出運(yùn)行
if __name__ == '__main__':
Input_event = threading.Event()
Input_event.set()
Input_simulate(5)
運(yùn)行結(jié)果:

小結(jié):該代碼等待鍵盤輸入,超時(shí)選擇默認(rèn)值,釋放input,之后重新進(jìn)入等待鍵盤輸入狀態(tài),直到用戶輸入可用數(shù)據(jù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中Tkinter復(fù)選框Checkbutton是否被選中判斷
這篇文章主要介紹了python中Tkinter復(fù)選框Checkbutton是否被選中判斷方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
python添加列表元素append(),extend()及?insert()
這篇文章主要介紹了python添加列表元素append(),extend()及?insert(),列表是儲存元素的數(shù)據(jù)類型,既然能存儲元素,那么就類似數(shù)據(jù)庫一樣,增刪改查的一些功能就不能少了。下面我們就來先看看添加列表元素方法有哪些,需要的朋友可以參考一下2022-03-03
Python使用BeautifulSoup爬取網(wǎng)頁數(shù)據(jù)的操作步驟
在網(wǎng)絡(luò)時(shí)代,數(shù)據(jù)是最寶貴的資源之一,而爬蟲技術(shù)就是一種獲取數(shù)據(jù)的重要手段,Python 作為一門高效、易學(xué)、易用的編程語言,自然成為了爬蟲技術(shù)的首選語言之一,本文將介紹如何使用 BeautifulSoup 爬取網(wǎng)頁數(shù)據(jù),并提供詳細(xì)的代碼和注釋,幫助讀者快速上手2023-11-11
SQLite5-使用Python來讀寫數(shù)據(jù)庫
這篇文章主要介紹了SQLite5-使用Python來讀寫數(shù)據(jù)庫,數(shù)據(jù)庫的實(shí)際應(yīng)用,通常需要與程序結(jié)合起來,通過程序來實(shí)現(xiàn)對數(shù)據(jù)庫的訪問和讀寫。本篇先介紹Python語言來調(diào)用SQLite數(shù)據(jù)庫,想具體了解的小伙伴可以參考一下</P><P>2021-12-12

