日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何用 Python 子進程關閉 Excel 自動化中的彈窗

瀏覽:31日期:2022-06-20 13:33:23

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

假想場景

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

import xlwings as xwwb = xw.Book(’test.xlsm’)msg = wb.sheets(’Sheet1’).range(’A1’).valueprint(msg)wb.close()

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

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

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

如何用 Python 子進程關閉 Excel 自動化中的彈窗

基本思路

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

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

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

from pywinauto.application import Applicationwin = Application(backend='win32').connect(title=’Microsoft Excel’)win.Dialog.Button.click()

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

title 需要捕捉的彈窗的標題,例如Excel默認彈窗的標題為Microsoft Excel interval 監聽的頻率,即每隔多少秒檢查一次

# listener.pyimport timefrom threading import Thread, Eventfrom pywinauto.application import Applicationclass 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()

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

啟動子線程監聽彈窗 主線程中打開Excel開始自動化操作 關閉子線程

import xlwings as xwfrom listener import MsgBoxListener# start listen threadlistener = MsgBoxListener(’Microsoft Excel’, 3)listener.start()# main process as beforewb = xw.Book(’test.xlsm’)msg = wb.sheets(’Sheet1’).range(’A1’).valueprint(msg)wb.close()# stop listener threadlistener.stop()

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

win32gui方案

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

pip install pywin32

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

import win32gui, win32condef _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)來關閉彈窗。同理替換MsgBoxListener類的_close_msgbox()方法(同時構造函數中不再需要title參數):

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 windowfor h_window in h_windows: # get child button with text OK, Yes or Confirm of given windowh_btn = win32gui.FindWindowEx(h_window, None,’Button’, None)if not h_btn: continue# check button texttext = win32gui.GetWindowText(h_btn)if not text.lower() in (’ok’, ’yes’, ’confirm’): continue# click buttonwin32gui.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)

最后,實例演示結束全文,以后再也不用擔心意外彈窗了。

如何用 Python 子進程關閉 Excel 自動化中的彈窗

以上就是如何用 Python 子進程關閉 Excel 自動化中的彈窗的詳細內容,更多關于Python 子進程關閉 Excel 彈窗的資料請關注好吧啦網其它相關文章!

標簽: python
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
只有精品亚洲| 欧美视频精品全部免费观看| 青草国产精品久久久久久| 精品一区亚洲| 成人精品视频| 日韩欧美午夜| 日韩av二区| 久久久久久久久丰满| 美女久久久久| 午夜国产精品视频| 日韩视频在线一区二区三区| 精品1区2区3区4区| 男人的天堂久久精品| 日本综合视频| 久久精品色播| 久久国产成人午夜av影院宅| 91九色精品| 视频一区视频二区中文| 亚洲人成高清| 国产视频一区二区在线播放| 国产色噜噜噜91在线精品| 久久精品国产久精国产| 国产综合精品一区| 伊人久久大香伊蕉在人线观看热v| 日韩综合一区二区| 国产一区国产二区国产三区| 亚洲高清成人| 777久久精品| 人人精品亚洲| 亚州国产精品| 亚洲午夜天堂| 首页欧美精品中文字幕| 国产成人1区| 久久国产精品亚洲77777| 亚洲人妖在线| 国产91在线播放精品| 亚洲欧美日本视频在线观看| 国产美女久久| 午夜宅男久久久| 在线看片国产福利你懂的| 亚洲不卡视频| 久久精品二区三区| 国产精品欧美大片| 蜜臀久久99精品久久一区二区| 国产精品蜜月aⅴ在线| 黄色免费成人| 免费高潮视频95在线观看网站| 四虎成人精品一区二区免费网站| 韩国精品主播一区二区在线观看| 日本精品另类| 国产精品日本欧美一区二区三区| 精品99在线| 国产精品theporn| 奇米色欧美一区二区三区| 不卡视频在线| 久久激情网站| 亚洲高清毛片| 欧美亚洲国产精品久久| 国产一区二区三区四区| 国产精品一级在线观看| 日韩福利视频一区| 午夜一级久久| 夜夜精品视频| 国产高清一区二区| 亚洲91视频| 午夜久久中文| 日韩欧美看国产| 三上亚洲一区二区| 黄毛片在线观看| 久久精品高清| 午夜欧美在线| 噜噜噜躁狠狠躁狠狠精品视频| 神马午夜久久| 免费一二一二在线视频 | 久久在线91| 激情久久一区二区| 青青久久av| 好看的亚洲午夜视频在线| 伊人久久成人| 在线一区免费观看| 在线观看一区| 天堂久久av| 欧美国产亚洲精品| 国产乱码午夜在线视频| 亚洲高清毛片| 日韩精品欧美大片| 国产精品va| 影音先锋国产精品| 国产精品久久乐| 日韩亚洲一区在线| 激情欧美日韩一区| 国产欧美一区| 欧美日中文字幕| 日本不卡在线视频| 日本久久精品| 丝袜美腿一区二区三区| 精品99久久| 亚洲一区亚洲| 日韩精品视频在线看| 91综合视频| 国产精品美女久久久浪潮软件| 欧美一级久久| 久久在线视频免费观看| 日韩av网站在线观看| 国产黄大片在线观看| 91高清一区| 久久麻豆视频| 99成人在线| 麻豆视频久久| 亚洲专区视频| 欧美日韩黑人| 中文字幕在线免费观看视频| 日韩av中文字幕一区二区 | 日韩三级久久| 亚洲精品成人一区| 午夜一级久久| 成人精品久久| 麻豆一区二区三| 日韩av网站在线观看| 男女男精品视频网| 婷婷丁香综合| 国产一区不卡| 国产福利亚洲| 国产精品chinese| 日韩欧美高清一区二区三区| 一区在线视频观看| 国内亚洲精品| 欧美~级网站不卡| 激情久久五月| 国产二区精品| 一区在线免费观看| 好吊一区二区三区| 天堂成人免费av电影一区 | 一区二区三区四区在线看| 蜜桃精品在线| 日韩国产欧美一区二区三区| 欧美一区自拍| 国产aⅴ精品一区二区四区| 99精品一区| 日韩欧美视频专区| 精精国产xxxx视频在线播放| 在线免费观看亚洲| 日韩一区亚洲二区| 另类欧美日韩国产在线| 午夜日韩在线| 久久久久美女| 国产调教一区二区三区| 老色鬼久久亚洲一区二区| 九九99久久精品在免费线bt| 欧美搞黄网站| 日本视频在线一区| 国产一区二区三区网| 久久影院一区| 亚洲一二av| 91精品福利观看| 国产一区二区视频在线看| 成人精品天堂一区二区三区| 国产视频一区免费看| 久久久久亚洲| 国产不卡av一区二区| 亚洲婷婷在线| 蜜桃视频一区二区三区| 国产精品密蕾丝视频下载| 视频福利一区| 国产欧美一区二区色老头| 狠狠久久婷婷| 日韩欧美精品一区| 欧美日韩1区2区3区| 日韩成人精品一区二区三区 | 国产精品久久乐| 亚洲一区二区免费看| 韩国久久久久久| 精品国产中文字幕第一页| 国产麻豆一区二区三区精品视频| 国产亚洲一区二区三区啪| av免费不卡国产观看| 亚洲1234区| 九一国产精品| 日韩电影免费网址| 欧美在线不卡| 视频在线在亚洲| 91久久黄色| 蜜臀av一区二区三区| 国产视频久久| 在线精品一区二区| 蜜臀久久99精品久久久久宅男| 日韩午夜一区| 日韩中文av| 久久精品国产成人一区二区三区| 99re国产精品| 日韩精品看片| 99日韩精品| 日韩福利视频网| 国产suv精品一区| 国产精品毛片| 国产精品一级| 国产99久久久国产精品成人免费| 国产亚洲网站| 国产精品一级在线观看| 国产aⅴ精品一区二区三区久久|