亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

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

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

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

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

假想場景

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

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代碼相應卡死在第一行。

基本思路

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

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

pywinauto方案

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

from pywinauto.application import Application

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

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

  • title 需要捕捉的彈窗的標題,例如Excel默認彈窗的標題為Microsoft Excel
  • interval 監聽的頻率,即每隔多少秒檢查一次
# 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()

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

  • 啟動子線程監聽彈窗
  • 主線程中打開Excel開始自動化操作
  • 關閉子線程
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()

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

win32gui方案

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

pip install pywin32

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

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)來關閉彈窗。同理替換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 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)

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

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

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

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

巨人網絡通訊聲明:本文標題《如何用 Python 子進程關閉 Excel 自動化中的彈窗》,本文關鍵詞  如,何用,Python,子,進程,關閉,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何用 Python 子進程關閉 Excel 自動化中的彈窗》相關的同類信息!
  • 本頁收集關于如何用 Python 子進程關閉 Excel 自動化中的彈窗的相關信息資訊供網民參考!
  • 推薦文章
    欧美一级视频高清片| 色综合久久天天综合| 国产美女在线一区二区三区| 黄视频网站在线免费观看| 欧美激情一区二区三区视频 | 日本免费区| 日韩专区一区| 日韩中文字幕一区二区不卡| 日韩女人做爰大片| 精品视频一区二区| 国产原创中文字幕| 可以免费在线看黄的网站| 99色播| 国产综合成人观看在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡福利| 一级片片| 麻豆污视频| 二级特黄绝大片免费视频大片| 欧美国产日韩在线| 99久久精品国产高清一区二区| 成人高清视频免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产亚洲免费观看| 国产亚洲精品aaa大片| 美国一区二区三区| 日本在线不卡免费视频一区| 日本在线不卡视频| 夜夜操网| 999精品视频在线| 国产伦精品一区二区三区在线观看| 黄视频网站免费观看| 中文字幕一区二区三区 精品| 久草免费资源| 午夜久久网| 亚洲 欧美 成人日韩| 精品视频免费观看| 欧美另类videosbestsex久久| 国产91精品一区二区| 欧美18性精品| 国产精品1024永久免费视频| 午夜精品国产自在现线拍| 欧美日本免费| 色综合久久天天综合| 国产成人欧美一区二区三区的| 韩国三级视频在线观看| 久久精品免视看国产成人2021| 精品国产一区二区三区精东影业| 国产欧美精品| 九九九国产| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产a一级| 国产一区精品| 国产麻豆精品| 色综合久久天天综合绕观看| 欧美国产日韩一区二区三区| 欧美a级片免费看| 在线观看成人网 | 国产欧美精品午夜在线播放| 久久国产一久久高清| 美女免费精品视频在线观看| 精品视频在线看| 国产原创视频在线| 国产福利免费视频| 精品久久久久久中文| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 99色播| 91麻豆精品国产片在线观看 | 欧美日本二区| 高清一级毛片一本到免费观看| 日韩在线观看视频免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 四虎久久精品国产| 国产高清在线精品一区二区| 精品国产一区二区三区精东影业| 久久久久久久网| 免费国产在线观看不卡| 欧美日本国产| 精品视频在线看 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产一区二区精品| 九九热国产视频| 欧美大片一区| 91麻豆精品国产片在线观看| 九九精品影院| 久久99欧美| 欧美电影免费看大全| 国产91素人搭讪系列天堂| 日本在线不卡视频| 久久精品成人一区二区三区| 麻豆系列 在线视频| 亚洲wwwwww| 国产精品123| 欧美爱色| 一级女性全黄生活片免费| 精品国产亚洲人成在线| 尤物视频网站在线| 国产精品自拍在线| 精品国产亚洲人成在线| 欧美日本免费| 欧美日本免费| 日韩字幕在线| 天堂网中文字幕| 日韩中文字幕一区| 亚洲精品中文字幕久久久久久| 国产一区二区精品久久| 日韩一级黄色| 国产综合成人观看在线| 日韩女人做爰大片| 成人av在线播放| 日本在线www| 99久久精品费精品国产一区二区| 韩国三级视频网站| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美国产日韩精品| 精品国产一区二区三区久久久蜜臀 | 97视频免费在线观看| 日本特黄特黄aaaaa大片| 99色视频在线观看| 国产高清在线精品一区a| 成人高清视频免费观看| 欧美激情一区二区三区在线| 国产91精品露脸国语对白| 韩国三级视频网站| 久久久久久久网| 国产麻豆精品免费密入口| 黄视频网站免费观看| 日韩女人做爰大片| 99久久视频| 国产原创中文字幕| 99色视频在线| 天天色成人网| 天天做人人爱夜夜爽2020毛片| 国产美女在线一区二区三区| 国产高清在线精品一区二区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美电影免费| 国产一区免费在线观看| 天天做日日爱| 高清一级淫片a级中文字幕| 欧美激情一区二区三区在线播放 | 四虎影视库| 一级毛片视频免费| 国产91精品系列在线观看| 国产亚洲免费观看| 91麻豆精品国产自产在线| 可以在线看黄的网站| 欧美日本免费| 久久久成人网| 国产精品自拍在线观看| 免费国产在线视频| 欧美另类videosbestsex久久| 九九干| 日本免费乱人伦在线观看| 一 级 黄 中国色 片| 亚欧成人乱码一区二区| 999精品在线| 欧美18性精品| 人人干人人插| 日韩在线观看免费完整版视频| 亚洲精品久久久中文字| 国产一区二区福利久久| 国产高清视频免费观看| 高清一级淫片a级中文字幕| 黄色福利| 国产伦理精品| 日韩av成人| 毛片电影网| 亚洲第一色在线| 日韩av东京社区男人的天堂| 国产精品自拍在线观看| 日本特黄特黄aaaaa大片| 国产成人精品综合在线| 国产一区免费在线观看| 精品国产香蕉伊思人在线又爽又黄| 日本在线www| 日韩在线观看免费完整版视频| 中文字幕一区二区三区精彩视频| 国产不卡在线观看| 国产一区二区精品尤物| 国产视频网站在线观看| 一 级 黄 中国色 片| 欧美一级视频免费| 久久精品道一区二区三区| 欧美大片毛片aaa免费看| 日韩在线观看视频黄| 色综合久久天天综线观看| 可以免费看污视频的网站| 999精品在线| 久久成人综合网| 成人免费观看的视频黄页| 精品国产亚洲一区二区三区| 国产亚洲精品aaa大片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 色综合久久天天综合| 999精品在线| 九九免费精品视频| 国产成人精品综合久久久| 欧美激情在线精品video| 91麻豆高清国产在线播放|