成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 如何用 Python 子進程關(guān)閉 Excel 自動化中的彈窗

如何用 Python 子進程關(guān)閉 Excel 自動化中的彈窗

熱門標簽:電信營業(yè)廳400電話申請 外呼不封號系統(tǒng) 江蘇房產(chǎn)電銷機器人廠家 悟空智電銷機器人6 幫人做地圖標注收費算詐騙嗎 荊州云電銷機器人供應(yīng)商 蘇州電銷機器人十大排行榜 遼寧400電話辦理多少錢 溫州旅游地圖標注

利用Python進行Excel自動化操作的過程中,尤其是涉及VBA時,可能遇到消息框/彈窗(MsgBox)。此時需要人為響應(yīng),否則代碼卡死直至超時 [^1] [^2]。根本的解決方法是VBA代碼中不要出現(xiàn)類似彈窗,但有時我們無權(quán)修改被操作的Excel文件,例如這是我們進行自動化測試的對象。所以本文記錄從代碼角度解決此類問題的方法。

假想場景

使用xlwings(或者其他自動化庫)打開Excel文件test.xlsm,讀取Sheet1!A1單元格內(nèi)容。很簡單的一個操作:

import xlwings as xw

wb = xw.Book('test.xlsm')
msg = wb.sheets('Sheet1').range('A1').value
print(msg)
wb.close()

然而不幸的是,打開工作簿時進行了熱情的歡迎儀式:

Private Sub Workbook_Open()
    MsgBox "Welcome"
    MsgBox "to open"
    MsgBox "this file."
End Sub

第一個彈窗Welcome就卡住了Excel,Python代碼相應(yīng)卡死在第一行。

基本思路

主程序中不可能直接處理或者繞過此類問題,也不能奢望有人隨時蹲守點擊下一步——那就開啟一個子線程來護航吧。因此,解決方案是利用子線程監(jiān)聽并隨時關(guān)閉彈窗,直到主程序圓滿結(jié)束。
解決這個問題,需要以下兩個知識點(基礎(chǔ)知識請課外學(xué)習(xí)):

  • Python多線程(本文采用threading.Thread)
  • Python界面自動化庫(本文涉及pywinauto和pywin32)

pywinauto方案

pywinauto顧名思義是Windows界面自動化庫,模擬鼠標和鍵盤操作窗體和控件 [^3]。不同于先獲取句柄再獲取屬性的傳統(tǒng)方式,pywinauto的API更加友好和pythonic。例如,兩行代碼搞定窗口捕捉和點擊:

from pywinauto.application import Application

win = Application(backend="win32").connect(title='Microsoft Excel')
win.Dialog.Button.click()

本文采用自定義線程類的方式,啟動線程后自動執(zhí)行run()函數(shù)來完成上述操作。具體代碼如下,注意構(gòu)造函數(shù)中的兩個參數(shù):

  • title 需要捕捉的彈窗的標題,例如Excel默認彈窗的標題為Microsoft Excel
  • interval 監(jiān)聽的頻率,即每隔多少秒檢查一次
# listener.py

import time
from threading import Thread, Event
from pywinauto.application import Application


class MsgBoxListener(Thread):

    def __init__(self, title:str, interval:int):
        Thread.__init__(self)
        self._title = title 
        self._interval = interval 
        self._stop_event = Event()   

    def stop(self): self._stop_event.set()

    @property
    def is_running(self): return not self._stop_event.is_set()

    def run(self):
        while self.is_running:
            try:
                time.sleep(self._interval)
                self._close_msgbox()
            except Exception as e:
                print(e, flush=True)


    def _close_msgbox(self):
        '''Close the default Excel MsgBox with title "Microsoft Excel".'''        
        win = Application(backend="win32").connect(title=self._title)
        win.Dialog.Button.click()


if __name__=='__main__':
    t = MsgBoxListener('Microsoft Excel', 3)
    t.start()
    time.sleep(10)
    t.stop()

于是,整個過程分為三步:

  • 啟動子線程監(jiān)聽彈窗
  • 主線程中打開Excel開始自動化操作
  • 關(guān)閉子線程
import xlwings as xw
from listener import MsgBoxListener

# start listen thread
listener = MsgBoxListener('Microsoft Excel', 3)
listener.start()

# main process as before
wb = xw.Book('test.xlsm')
msg = wb.sheets('Sheet1').range('A1').value
print(msg)
wb.close()

# stop listener thread
listener.stop()

到此問題基本解決,本地運行效果完全達到預(yù)期。但我的真實需求是以系統(tǒng)服務(wù)方式在服務(wù)器上進行Excel文件自動化測試,后續(xù)發(fā)現(xiàn),當以系統(tǒng)服務(wù)方式運行時,pywinauto竟然捕捉不到彈窗!這或許是pywinauto一個潛在的問題 [^4]。

win32gui方案

那就只好轉(zhuǎn)向相對底層的win32gui,所幸完美解決了上述問題。
win32gui是pywin32庫的一部分,所以實際安裝命令是:

pip install pywin32

整個方案和前文描述完全一致,只是替換MsgBoxListener類中關(guān)閉彈窗的方法:

import win32gui, win32con

def _close_msgbox(self):
    # find the top window by title
    hwnd = win32gui.FindWindow(None, self._title)
    if not hwnd: return

    # find child button
    h_btn = win32gui.FindWindowEx(hwnd, None,'Button', None)
    if not h_btn: return

    # show text
    text = win32gui.GetWindowText(h_btn)
    print(text)

    # click button        
    win32gui.PostMessage(h_btn, win32con.WM_LBUTTONDOWN, None, None)
    time.sleep(0.2)
    win32gui.PostMessage(h_btn, win32con.WM_LBUTTONUP, None, None)
    time.sleep(0.2)

更一般的方案

更一般地,當同時存在默認標題和自定義標題的彈窗時,就不便于采用標題方式進行捕捉了。例如

MsgBox "Message with default title.", vbInformation, 
MsgBox "Message with title My App 1", vbInformation, "My App 1"
MsgBox "Message with title My App 2", vbInformation, "My App 2"

那就擴大搜索范圍,依次點擊所有包含確定性描述的按鈕(例如OK,Yes,Confirm)來關(guān)閉彈窗。同理替換MsgBoxListener類的_close_msgbox()方法(同時構(gòu)造函數(shù)中不再需要title參數(shù)):

def _close_msgbox(self):
    '''Click any button ("OK", "Yes" or "Confirm") to close message box.'''
    # get handles of all top windows
    h_windows = []
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), h_windows) 

    # check each window    
    for h_window in h_windows:            
        # get child button with text OK, Yes or Confirm of given window
        h_btn = win32gui.FindWindowEx(h_window, None,'Button', None)
        if not h_btn: continue

        # check button text
        text = win32gui.GetWindowText(h_btn)
        if not text.lower() in ('ok', 'yes', 'confirm'): continue

        # click button
        win32gui.PostMessage(h_btn, win32con.WM_LBUTTONDOWN, None, None)
        time.sleep(0.2)
        win32gui.PostMessage(h_btn, win32con.WM_LBUTTONUP, None, None)
        time.sleep(0.2)

最后,實例演示結(jié)束全文,以后再也不用擔(dān)心意外彈窗了。

以上就是如何用 Python 子進程關(guān)閉 Excel 自動化中的彈窗的詳細內(nèi)容,更多關(guān)于Python 子進程關(guān)閉 Excel 彈窗的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python子線程如何有序執(zhí)行
  • 解決python父線程關(guān)閉后子線程不關(guān)閉問題
  • Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式示例
  • python清理子進程機制剖析
  • python使用Queue在多個子進程間交換數(shù)據(jù)的方法
  • Python的子線程和子進程是如何手動結(jié)束的?

標簽:濟南 宿遷 喀什 景德鎮(zhèn) 臺灣 黃山 三沙 欽州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《如何用 Python 子進程關(guān)閉 Excel 自動化中的彈窗》,本文關(guān)鍵詞  如,何用,Python,子,進程,關(guān)閉,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何用 Python 子進程關(guān)閉 Excel 自動化中的彈窗》相關(guān)的同類信息!
  • 本頁收集關(guān)于如何用 Python 子進程關(guān)閉 Excel 自動化中的彈窗的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    嫩草影院在线观看网站成人| 天天做夜夜爱爱爱| 免费成人av资源网| 不卡av免费在线| 色诱视频网站一区| 波多野结衣一区二区三区四区| 亚洲永久精品一区| 亚洲天堂男人的天堂| 国产三级短视频| 欧美性xxxx在线播放| 乱h高h女3p含苞待放| 精品国产伦一区二区三区观看体验| 亚洲黄色在线观看视频| 欧美h版在线观看| 国产喷水theporn| 水蜜桃在线免费观看| 爱草tv视频在线观看992| 日韩精品极品| 亚洲第一免费播放区| 欧美激情国内自拍| 黑人巨大国产9丨视频| 日韩视频在线观看国产| 日韩成人av毛片| 中国女人内谢25xxxxx| 亚洲美女在线免费观看| 国内揄拍国内精品| 清纯唯美激情亚洲| 亚洲第一视频在线播放| 57pao成人国产永久免费| 午夜精品一区二区三区免费视频| 国产精品成人播放| 在线能看的黄色| 成人亚洲精品| 国产精品久久久久久久久免费| 欧美视频一区| 欧美成人久久电影香蕉| 在线观看欧美一区二区| 青青草国产精品| 最新日韩av在线| 精品自拍偷拍视频| 俺去俺来也在线www色官网| 欧美精品一区二区高清在线观看| 日韩女优一区二区| 亚洲偷熟乱区亚洲香蕉av| 日日干天夜夜| 欧美另类精品xxxx孕妇| 欧美日韩一区二区在线| 国产大屁股喷水视频在线观看| 国产精品毛片a∨一区二区三区|国| 日韩一区二区电影在线观看| 911精品美国片911久久久| 色综合.com| 男人的天堂a在线| 777777国产7777777| 亚洲精品网址在线观看| 亚洲中文字幕一区| 精品一成人岛国片在线观看| 伦理片一区二区三区| 国内精品小视频在线观看| 欧美黑人极品猛少妇色xxxxx| 久久久综合av| 超碰成人在线播放| 极品日韩av| 老司机午夜激情| 日韩精品一区二区三区在线视频| yjizz视频网站在线播放| 国产福利91精品一区二区| 中文字幕无线码一区| 无码av免费一区二区三区试看| 国产精品无码一本二本三本色| 欧美freesex8一10精品| 天堂电影在线| 日本粉色视频在线观看| 91精品久久久久久久久99蜜臂| 最美情侣韩剧在线播放| 国产精品三级视频| jazzjazz国产精品久久| 26uuu日韩精品一区二区| 国产日韩二区| 精品欧美黑人一区二区三区| 成人午夜精品福利免费| 欧美福利在线播放网址导航| 日韩在线观看免费全| 中文字幕av免费在线观看| 美国av一区二区| 亚洲国产成人精品一区二区| 污污视频在线免费观看| 色狠狠色噜噜噜综合网| 国产精品久久777777毛茸茸| 欧美日韩一区二区三区电影| va亚洲va日韩不卡在线观看| 国产一区二区三区不卡视频网站| 色999日韩国产欧美一区二区| 亚洲免费资源在线播放| 少妇性饥渴无码a区免费| 欧美精品日韩精品| 日本欧美一区二区| 日韩三级在线| 欧洲视频一区二区| 在线看国产一区| 天天操天天爱天天爽| 久草在线官网| 国产成人精品一区二区| 91九色丨porny丨国产jk| 九九三级毛片| 中文字幕国产欧美| 一本久久a久久精品亚洲| 欧美高清一区二区| 日本中文字幕视频在线| 亚洲一区二区三区久久久| 成人影院在线观看视频| 日韩精品一区二区三区在线视频| 午夜毛片在线| 中国免费黄视频| 日韩欧美在线综合网| 免费在线视频你懂的| 性高潮久久久久久久| 香蕉视频网站在线播放| 精品乱码一区| 成人国产精品色哟哟| 午夜视频免费在线观看| 久久综合九色综合88i| 写真福利片hd在线观看| 欧美一区二区视频97| 午夜精品久久久久久久99热浪潮| 四虎国产精品免费观看| 在线观看的毛片| 亚洲人与黑人屁股眼交| 国产成人精品一区二区免费视频| 亚洲av无码精品一区二区| 欧美xxxxx性| 国产精品网站免费| 超碰这里只有精品| 一级片在线免费播放| 精品国偷自产一区二区三区| 亚洲综合激情在线| 激情懂色av一区av二区av| 91色琪琪电影亚洲精品久久| 日本高清久久| 亚洲 欧美 日韩 在线| 亚洲美女在线观看| 青青草免费观看完整版高清| 亚洲综合成人婷婷小说| 精品一区二区三区国产| 91美女高潮出水| 国产福利电影网| 亚洲精品久久久久久一区二区| 三上悠亚一区二区| 中文字幕+乱码+中文乱码www| 日韩欧美中文字幕一区| 欧美一级一级性生活免费录像| 国产卡一卡二在线| 国产精品入口免费| 亚洲三级欧美| 免费网站黄在线观看| 日韩久久午夜影院| 日本在线不卡一区| 91成年人网站| av小说天堂网| 国产精品豆花视频| 国产成人久久精品77777最新版本| 亚洲综合在线播放| 欧美成人精品一区二区三区在线看| av中文字幕第一页| 欧美成人sm免费视频| 日本中文字幕在线看| 欧美自拍资源在线| 国产亚洲情侣一区二区无| 337p粉嫩大胆色噜噜噜噜亚洲| 福利h视频在线| 日本精品一区二区三区在线播放视频| 青青视频免费在线观看| 欧美人成在线观看ccc36| 欧美激情videos| 国产真实伦在线观看| 九九九九九九九九| 亚洲第一久久影院| 色哟哟精品丝袜一区二区| 久久久久国产精品| 国产精品第九页| 曰韩精品一区二区| 欧美日本韩国一区| 国产一区二区亚洲| 高清精品在线| 性欧美高清强烈性视频| 日韩黄色在线视频| 麻豆9191精品国产| 羞羞小视频在线观看| www.久久久.com| 国产精品国产三级国产aⅴ浪潮| 99re在线播放| 7799精品视频天天看| 亚洲午夜极品| 国产素人在线观看| 性生活在线视频| 玖草视频在线| 日日骚一区二区网站| 亚洲天堂影院在线观看| 国产精品大片| 亚洲欧洲偷拍精品| 亚洲国产精品传媒在线观看| 91麻豆免费观看| 国产肉体xxxx裸体784大胆| 免费在线观看av的网站| 国产一区二区三区四区五区六区| 国产91在线免费| 国产不卡av在线播放| 成人性做爰片免费视频| 全国精品久久少妇| 717影院理论午夜伦不卡久久| 国产亚洲精品久久久久久移动网络| 国产三级视频网站| 国产一区二区精品在线观看| 亚洲日本视频在线| 四虎精品在线观看| 国产欧美视频在线观看| 亚洲福利天堂| 色综合咪咪久久网| 羞羞色国产精品网站| 一个人免费观看日本www视频| 337p粉嫩色噜噜噜大肥臀| 夜夜骚av一区二区三区| 精品一性一色一乱农村| 亚洲天堂一区在线观看| 91丨porny丨户外露出| 好吊日视频在线观看| 青娱乐国产在线视频| 欧美色欧美亚洲另类| 精品国产亚洲一区二区三区在线| 丁香在线视频| 亚洲三级电影全部在线观看高清| 久久久精品国产亚洲| 亚洲精品aaa| 粉嫩的18在线观看极品精品| 国产成人精品一区二区三区视频| 欧美人善交videosg| 99热这里只有精品在线播放| 美女视频黄是免费| 综合网在线观看| 国产成人亚洲综合小说区| 99国产精品久久一区二区三区| 亚洲欧洲日韩国产| 国产精品嫩草影院久久久| 日韩免费看网站| 销魂美女一区二区| 在线免费电影观看| 日本一区二区三区在线免费观看| 欧洲毛片视频| 蜜桃视频在线观看免费视频网站www| 欧美日韩国产精品一区| 精品一区二区无码| 中文字幕在线影院| 91精品国产色综合| 日日骚久久av| 亚洲网站在线看| 亚洲精品久久在线| 国产亚洲精品aa| 日本久久久久久久久| 97se亚洲综合| 日韩最新在线| 亚洲mv大片欧洲mv大片| 伊人永久在线| 天美星空大象mv在线观看视频| 97精品国产97久久久久久免费| 久久另类ts人妖一区二区| 免费看成人人体视频| 国产亚洲一区二区精品| jizzjizz欧美69巨大| 色婷婷av久久久久久久| 在线播放性xxx欧美| 国产视频福利在线| 国产女同一区二区| 国产精品影院在线观看| 在线免费看a| 欧美性videosxxxxx| 国产精品女人久久久久久| 久久精品亚洲热| 色88888久久久久久影院野外| 熟妇人妻系列aⅴ无码专区友真希| 波多野结衣精品久久| 欧美精品在欧美一区二区少妇| 亚洲第一视频在线观看| 精品国产乱码久久久久夜深人妻| 狠狠久久婷婷| 一个人免费观看在线视频www| 日本高清免费观看| 成人黄色激情视频| 日韩欧美在线一区二区| 9191国产视频| 黄色片免费在线观看视频| 国产小视频免费在线观看| 另类小说综合网| 亚洲狠狠丁香婷婷综合久久久| www.97av.com| 亚洲麻豆视频| 亚洲av无码一区东京热久久| 操人视频在线观看| 99ri国产在线| 91精品久久久久久久久久久| www.麻豆| 成人综合在线视频| 国产福利在线观看| 精品国产av 无码一区二区三区| 欧洲精品久久久久毛片完整版| 欧美va在线| 中国jizz妇女jizz妇女| 麻豆久久久久久久久久| 亚洲最新av网站| aaa人片在线| 在线播放黄色av| 天天伊人狠狠| 日韩欧美不卡在线观看视频| 99久久婷婷国产精品综合| 一区二区视频观看| 麻豆国产一区二区| 7777精品伊人久久久大香线蕉最新版| 中文字幕桃花岛| 婷婷丁香一区二区三区| 日韩欧美国产精品| 国产精品狼人久久影院观看方式| 午夜不卡一区| 乱妇乱女熟妇熟女网站| 欧美在线视频网站| 欧美性生交xxxxx久久久| 亚洲国产欧美久久| 国产91对白在线播放| 99精品人妻少妇一区二区| 国产成人高清|