电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

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

假想場(chǎng)景

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

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

然而不幸的是,打開(kāi)工作簿時(shí)進(jìn)行了熱情的歡迎儀式:

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

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

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

基本思路

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

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

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

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

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

title 需要捕捉的彈窗的標(biāo)題,例如Excel默認(rèn)彈窗的標(biāo)題為Microsoft Excel interval 監(jiān)聽(tīng)的頻率,即每隔多少秒檢查一次

# 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()

于是,整個(gè)過(guò)程分為三步:

啟動(dòng)子線程監(jiān)聽(tīng)彈窗 主線程中打開(kāi)Excel開(kāi)始自動(dòng)化操作 關(guān)閉子線程

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()

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

win32gui方案

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

pip install pywin32

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

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)更一般的方案

更一般地,當(dāng)同時(shí)存在默認(rèn)標(biāo)題和自定義標(biāo)題的彈窗時(shí),就不便于采用標(biāo)題方式進(jìn)行捕捉了。例如

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'

那就擴(kuò)大搜索范圍,依次點(diǎn)擊所有包含確定性描述的按鈕(例如OK,Yes,Confirm)來(lái)關(guān)閉彈窗。同理替換MsgBoxListener類的_close_msgbox()方法(同時(shí)構(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 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)

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

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

以上就是如何用 Python 子進(jìn)程關(guān)閉 Excel 自動(dòng)化中的彈窗的詳細(xì)內(nèi)容,更多關(guān)于Python 子進(jìn)程關(guān)閉 Excel 彈窗的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: python
相關(guān)文章:
主站蜘蛛池模板: 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 常州减速机_减速机厂家_常州市减速机厂有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | POS机官网 - 拉卡拉POS机免费办理|官网在线申请入口 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 早报网| 道康宁消泡剂-瓦克-大川进口消泡剂供应商 | 天津力值检测-天津管道检测-天津天诚工程检测技术有限公司 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 电车线(用于供电给电车的输电线路)-百科 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 |