pythondelay
⑴ python中@retry是個類嗎
retry是一個用於錯誤處理的模塊,功能類似try-except,但更加快捷方便。
retry模塊中retry()的基本用法:retry()的功能是在其裝飾的函數運行報錯後重新運行該函數,retry()有幾個主要參數:
exceptions:傳入指定的錯誤類型,默認為Exception,即捕獲所有類型的錯誤,也可傳入元組形式的多種指定錯誤類型
tries:定義捕獲錯誤之後重復運行次數,默認為-1,即為無數次
delay:定義每次重復運行之間的停頓時長,單位秒,默認為0,即無停頓
⑵ python 主程序結束的時候線程是否結束問題2個問題
第一個問題:因為主進程已經結束,相關的資源已經釋放,而線程還在後台運行,所以會導致線程找不到相關的資源和定義
第二個問題:因為主程序結束的時候,並沒有等待子線程結束,也沒有強制關閉子線程,因此還在後台運行,有兩個辦法可以讓他們同時結束,一個辦法是在在構建進程的時候增加參數 deamon=True, 第二個辦法就是在程序最後增加thread1.join(),thread2.join()
⑶ 用python win32 獲得計算器里的計算結果
給你一個思路。用python的win32gui可以枚舉所有窗口句柄,想辦法獲取窗口句柄,然後通過GetWindowText()方法來獲取窗口的標題,也就是結果所在的窗口句柄。
我用WIN32試了一下,我是hook了滑鼠所在的句柄,但當滑鼠指向結果時,結果的窗口句柄獲取不到,只能獲取到結果窗口的上一個窗口的句柄(也就是你圖中的00280756的句柄),但可以通過枚舉子窗口來獲取(也就是枚舉你圖片中的002F0854句柄),然後經過一系列匹配和判斷最終得到結果的值。
#encoding:gb2312
importwin32gui
def_MyCallback(hwnd,extra):
hwnds=extra
hwnds.append(hwnd)
def_CallBack(hwnd,extra):
value,m_index=extra
ifwin32gui.GetClassName(hwnd)=='Static':
m_index.append(None)
iflen(m_index)==4:
value.append(win32gui.GetWindowText(hwnd))
defTestEnumWindows():
windows=[]
results=[]
win32gui.EnumWindows(_MyCallback,(windows))
i=0
forhwndinwindows:
ifwin32gui.GetClassName(hwnd)=='CalcFrame':
m_index=[]
win32gui.EnumChildWindows(hwnd,_CallBack,(results,m_index))
i+=1
forresultinresults:
print'計算器的結果為:',result
TestEnumWindows()
這樣更好一些,可能有些特徵不同。我是枚舉所有窗口,然後獲取窗口的classname為CalcFrame的窗口,然後再枚舉CalcFrame的子窗口,然後判斷第4個出現的Static控制項就是結果的控制項。
⑷ python 多線程如何延時
importtime
fromthreadingimportThread
##定時輸入
classk(object):
x=0
sleepTime=0
def__init__(self,sleepTime=0):
self.sleepTime=sleepTime
self.input_delay_test()
definput_delay(self):
self.x=input("pleaseinput ")
definput_delay_test(self):
thd=Thread(target=self.input_delay)
thd.daemon=True
thd.start()
time.sleep(self.sleepTime)
print(self.x,self.sleepTime,sep='')
[print(x,end='')forxinrange(10)]
k(4)
⑸ python中如何在程序中可以同時播放兩個音樂
import _thread
import time
from playsound import playsound
def time1(delay):
time.sleep(1)
playsound("bgm.mp3")
def time2(delay):
time.sleep(2)
playsound("auido.mp3")
try:
_thread.start_new_thread(time1, (1,))
_thread.start_new_thread(time2, (1,))
except:
print("Program Error")
while 1:
pass
⑹ python中包的理解與運用
6.4. 包
包通常是使用用「圓點模塊名」的結構化模塊命名空間。例如,名為 A.B 的模塊表示了名為 A 的包中名為 B 的子模塊。正如同用模塊來保存不同的模塊架構可以避免全局變數之間的相互沖突,使用圓點模塊名保存像 NumPy 或 Python Imaging Library 之類的不同類庫架構可以避免模塊之間的命名沖突。
假設你現在想要設計一個模塊集(一個「包」)來統一處理聲音文件和聲音數據。存在幾種不同的聲音格式(通常由它們的擴展名來標識,例如:.wav, .aiff,.au ),於是,為了在不同類型的文件格式之間轉換,你需要維護一個不斷增長的包集合。可能你還想要對聲音數據做很多不同的操作(例如混音,添加回聲,應用平衡 功能,創建一個人造效果),所以你要加入一個無限流模塊來執行這些操作。你的包可能會是這個樣子(通過分級的文件體系來進行分組)
當導入這個包時,Python 通過 sys.path 搜索路徑查找包含這個包的子目錄。
為了讓 Python 將目錄當作內容包,目錄中必須包含 __init__.py 文件。這是為了避免一個含有爛俗名字的目錄無意中隱藏了稍後在模塊搜索路徑中出現的有效模塊,比如 string。最簡單的情況下,只需要一個空的 __init__.py 文件即可。當然它也可以執行包的初始化代碼,或者定義稍後介紹的 __all__ 變數。
用戶可以每次只導入包里的特定模塊,例如:
import sound.effects.echo
這樣就導入了 sound.effects.echo 子模塊。它必需通過完整的名稱來引用:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
導入包時有一個可以選擇的方式:
from sound.effects import echo
這樣就載入了 echo 子模塊,並且使得它在沒有包前綴的情況下也可以使用,所以它可以如下方式調用:
echo.echofilter(input, output, delay=0.7, atten=4)
還有另一種變體用於直接導入函數或變數:
from sound.effects.echo import echofilter
這樣就又一次載入了 echo 子模塊,但這樣就可以直接調用它的 echofilter() 函數:
echofilter(input, output, delay=0.7, atten=4)
需要注意的是使用 from package import item 方式導入包時,這個子項(item)既可以是包中的一個子模塊(或一個子包),也可以是包中定義的其它命名,像函數、類或變數。import 語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模塊,並嘗試載入它。如果沒有找到它,會引發一個 ImportError 異常。
⑺ Python繪圖Turtle庫詳解
Turtle庫是Python語言中一個很流行的繪制圖像的函數庫,想像一個小烏龜,在一個橫軸為x、縱軸為y的坐標系原點,(0,0)位置開始,它根據一組函數指令的控制,在這個平面坐標系中移動,從而在它爬行的路徑上繪制了圖形。
turtle 繪圖的基礎知識:
1. 畫布(canvas)
畫布就是turtle為我們展開用於繪圖區域,我們可以設置它的大小和初始位置。
設置畫布大小
turtle.screensize(canvwidth=None, canvheight=None, bg=None),參數分別為畫布的寬(單位像素), 高, 背景顏色。
如:turtle.screensize(800,600, "green")
turtle.screensize() #返回默認大小(400, 300)
turtle.setup(width=0.5, height=0.75,
startx=None, starty=None),參數:width, height: 輸入寬和高為整數時, 表示像素; 為小數時, 表示占據電腦屏幕的比例,(startx, starty): 這一坐標表示矩形窗口左上角頂點的位置, 如果為空,則窗口位於屏幕中心。
如:turtle.setup(width=0.6,height=0.6)
turtle.setup(width=800,height=800, startx=100, starty=100)
2. 畫筆
2.1 畫筆的狀態
在畫布上,默認有一個坐標原點為畫布中心的坐標軸,坐標原點上有一隻面朝x軸正方向小烏龜。這里我們描述小烏龜時使用了兩個詞語:坐標原點(位置),面朝x軸正方向(方向), turtle繪圖中,就是使用位置方向描述小烏龜(畫筆)的狀態。
2.2 畫筆的屬性
畫筆(畫筆的屬性,顏色、畫線的寬度等)
1) turtle.pensize():設置畫筆的寬度;
2) turtle.pencolor():沒有參數傳入,返回當前畫筆顏色,傳入參數設置畫筆顏色,可以是字元串如"green", "red",也可以是RGB 3元組。
3) turtle.speed(speed):設置畫筆移動速度,畫筆繪制的速度范圍[0,10]整數,數字越大越快。
2.3 繪圖命令
操縱海龜繪圖有著許多的命令,這些命令可以劃分為3種:一種為運動命令,一種為畫筆控制命令,還有一種是全局控制命令。
(1) 畫筆運動命令
命令說明
turtle.forward(distance)向當前畫筆方向移動distance像素長度
turtle.backward(distance)向當前畫筆相反方向移動distance像素長度
turtle.right(degree)順時針移動degree°
turtle.left(degree)逆時針移動degree°
turtle.pendown()移動時繪制圖形,預設時也為繪制
turtle.goto(x,y)將畫筆移動到坐標為x,y的位置
turtle.penup()提起筆移動,不繪制圖形,用於另起一個地方繪制
turtle.circle()畫圓,半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓
setx( )將當前x軸移動到指定位置
sety( )將當前y軸移動到指定位置
setheading(angle)設置當前朝向為angle角度
home()設置當前畫筆位置為原點,朝向東。
dot(r)繪制一個指定直徑和顏色的圓點
(2) 畫筆控制命令
命令說明
turtle.fillcolor(colorstring)繪制圖形的填充顏色
turtle.color(color1, color2)同時設置pencolor=color1, fillcolor=color2
turtle.filling()返回當前是否在填充狀態
turtle.begin_fill()准備開始填充圖形
turtle.end_fill()填充完成
turtle.hideturtle()隱藏畫筆的turtle形狀
turtle.showturtle()顯示畫筆的turtle形狀
(3) 全局控制命令
命令說明
turtle.clear()清空turtle窗口,但是turtle的位置和狀態不會改變
turtle.reset()清空窗口,重置turtle狀態為起始狀態
turtle.undo()撤銷上一個turtle動作
turtle.isvisible()返回當前turtle是否可見
stamp()復制當前圖形
turtle.write(s
[,font=("font-name",font_size,"font_type")])
寫文本,s為文本內容,font是字體的參數,分別為字體名稱,大小和類型;font為可選項,font參數也是可選項
(4) 其他命令
命令說明
turtle.mainloop()或turtle.done()啟動事件循環 -調用Tkinter的mainloop函數。
必須是烏龜圖形程序中的最後一個語句。
turtle.mode(mode=None)設置烏龜模式(「standard」,「logo」或「world」)並執行重置。如果沒有給出模式,則返回當前模式。
模式初始龜標題正角度
standard向右(東)逆時針
logo向上(北)順時針
turtle.delay(delay=None)設置或返回以毫秒為單位的繪圖延遲。
turtle.begin_poly()開始記錄多邊形的頂點。當前的烏龜位置是多邊形的第一個頂點。
turtle.end_poly()停止記錄多邊形的頂點。當前的烏龜位置是多邊形的最後一個頂點。將與第一個頂點相連。
turtle.get_poly()返回最後記錄的多邊形。
⑻ python如何並列運行兩個for循環
需要用到多線程
#!/usr/bin/python3
import _thread
import time
# 為線程定義一個函數
def print_time( threadName, delay):
....count = 0
....while count < 5:
........time.sleep(delay)
........count += 1
........print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
# 創建兩個線程
try:
...._thread.start_new_thread( print_time, ("Thread-1", 2, ) )
...._thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
....print ("Error: 無法啟動線程")
while 1:
....time.sleep(5)
....print('is main ')
⑼ Python中異常重試的解決方案詳解
Python中異常重試的解決方案詳解
大家在做數據抓取的時候,經常遇到由於網路問題導致的程序保存,先前只是記錄了錯誤內容,並對錯誤內容進行後期處理。
原先的流程:
def crawl_page(url):
pass
def log_error(url):
pass
url = ""
try:
crawl_page(url)
except:
log_error(url)
改進後的流程:
attempts = 0
success = False
while attempts < 3 and not success:
try:
crawl_page(url)
success = True
except:
attempts += 1
if attempts == 3:
break
最近發現的新的解決方案:retrying
retrying是一個 Python的重試包,可以用來自動重試一些可能運行失敗的程序段。retrying提供一個裝飾器函數retry,被裝飾的函數就會在運行失敗的條件下重新執行,默認只要一直報錯就會不斷重試。
import random
from retrying import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
raise IOError("Broken sauce, everything is hosed!!!111one")
else:
return "Awesome sauce!"
print do_something_unreliable()
如果我們運行have_a_try函數,那麼直到random.randint返回5,它才會執行結束,否則會一直重新執行。
retry還可以接受一些參數,這個從源碼中Retrying類的初始化函數可以看到可選的參數:
stop_max_attempt_number:用來設定最大的嘗試次數,超過該次數就停止重試
stop_max_delay:比如設置成10000,那麼從被裝飾的函數開始執行的時間點開始,到函數成功運行結束或者失敗報錯中止的時間點,只要這段時間超過10秒,函數就不會再執行了
wait_fixed:設置在兩次retrying之間的停留時間
wait_random_min和wait_random_max:用隨機的方式產生兩次retrying之間的停留時間
wait_exponential_multiplier和wait_exponential_max:以指數的形式產生兩次retrying之間的停留時間,產生的值為2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已經retry的次數,如果產生的這個值超過了wait_exponential_max的大小,那麼之後兩個retrying之間的停留值都為wait_exponential_max。這個設計迎合了exponential backoff演算法,可以減輕阻塞的情況。
我們可以指定要在出現哪些異常的時候再去retry,這個要用retry_on_exception傳入一個函數對象:
def retry_if_io_error(exception):
return isinstance(exception, IOError)
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
with open("file", "r") as f:
return f.read()
在執行read_a_file函數的過程中,如果報出異常,那麼這個異常會以形參exception傳入retry_if_io_error函數中,如果exception是IOError那麼就進行retry,如果不是就停止運行並拋出異常。
我們還可以指定要在得到哪些結果的時候去retry,這個要用retry_on_result傳入一個函數對象:
def retry_if_result_none(result):
return result is None
@retry(retry_on_result=retry_if_result_none)
def get_result():
return None
在執行get_result成功後,會將函數的返回值通過形參result的形式傳入retry_if_result_none函數中,如果返回值是None那麼就進行retry,否則就結束並返回函數值。
⑽ 如何使用python3自帶的tkinter生成氣泡提示
可以參考這個:
fromtkinterimport*
fromtimeimporttime,localtime,strftime
classToolTip(Toplevel):
"""
.
,simplypassthewidgettothe
ToolTipconstructor
"""
def__init__(self,wdgt,msg=None,msgFunc=None,delay=1,follow=True):
"""
InitializetheToolTip
Arguments:
wdgt:
msg:
msgFunc:
delay:(maybefloat)
follow:IfTrue,theToolTipfollowsmotion,otherwisehides
"""
self.wdgt=wdgt
self.parent=self.wdgt.master#
Toplevel.__init__(self,self.parent,bg='black',padx=1,pady=1)#InitalisetheToplevel
self.withdraw()#Hideinitially
self.overrideredirect(True)#
self.msgVar=StringVar()#
ifmsg==None:
self.msgVar.set('Nomessageprovided')
else:
self.msgVar.set(msg)
self.msgFunc=msgFunc
self.delay=delay
self.follow=follow
self.visible=0
self.lastMotion=0
Message(self,textvariable=self.msgVar,bg='#FFFFDD',
aspect=1000).grid()#
self.wdgt.bind('<Enter>',self.spawn,'+')#Addbindingstothewidget.
self.wdgt.bind('<Leave>',self.hide,'+')
self.wdgt.bind('<Motion>',self.move,'+')
defspawn(self,event=None):
"""
SpawntheToolTip..
Arguments:
event:
"""
self.visible=1
self.after(int(self.delay*1000),self.show)#
defshow(self):
"""
"""
ifself.visible==1andtime()-self.lastMotion>self.delay:
self.visible=2
ifself.visible==2:
self.deiconify()
defmove(self,event):
"""
.
Arguments:
event:
"""
self.lastMotion=time()
ifself.follow==False:#Ifthefollowflagisnotset,
self.withdraw()
self.visible=1
self.geometry('+%i+%i'%(event.x_root+10,event.y_root+10))#
try:
self.msgVar.set(self.msgFunc())#Trytocallthemessagefunction.ails
except:
pass
self.after(int(self.delay*1000),self.show)
defhide(self,event=None):
"""
HidestheToolTip.
Arguments:
event:
"""
self.visible=0
self.withdraw()
defxrange2d(n,m):
"""
Arguments:
n:Thenumberofrowsinthe2drange
m:
Returns:
Ageneratorofvaluesina2drange
"""
return((i,j)foriinxrange(n)forjinxrange(m))
defrange2d(n,m):
"""
Arguments:
n:Thenumberofrowsinthe2drange
m:
Returns:
Alistofvaluesina2drange
"""
return[(i,j)foriinrange(n)forjinrange(m)]
defprint_time():
"""
:
HH:MM:SS.00
"""
t=time()
timeString='time='
timeString+=strftime('%H:%M:',localtime(t))
timeString+='%.2f'%(t%60,)
returntimeString
defmain():
root=Tk()
btnList=[]
for(i,j)inrange2d(6,4):
text='delay=%i '%i
delay=i
ifj>=2:
follow=True
text+='+follow '
else:
follow=False
text+='-follow '
ifj%2==0:
msg=None
msgFunc=print_time
text+='MessageFunction'
else:
msg='Buttonat%s'%str((i,j))
msgFunc=None
text+='StaticMessage'
btnList.append(Button(root,text=text))
ToolTip(btnList[-1],msg=msg,msgFunc=msgFunc,follow=follow,delay=delay)
btnList[-1].grid(row=i,column=j,sticky=N+S+E+W)
root.mainloop()
if__name__=='__main__':
main()