返回顶部
首页 > 资讯 > 后端开发 > Python >如何用 Python 子进程关闭 Excel 自动化中的弹窗
  • 392
分享到

如何用 Python 子进程关闭 Excel 自动化中的弹窗

python子进程python关闭excel弹窗 2022-06-02 22:06:20 392人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

利用python进行excel自动化操作的过程中,尤其是涉及VBA时,可能遇到消息框/弹窗(MsgBox)。此时需要人为响应,否则代码卡死直至超时 [^1] [^2]。根本的解决方法是VBA代码中不要出现类似弹窗,但

利用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 弹窗的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何用 Python 子进程关闭 Excel 自动化中的弹窗

本文链接: https://lsjlt.com/news/10567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用 Python 子进程关闭 Excel 自动化中的弹窗
    利用Python进行Excel自动化操作的过程中,尤其是涉及VBA时,可能遇到消息框/弹窗(MsgBox)。此时需要人为响应,否则代码卡死直至超时 [^1] [^2]。根本的解决方法是VBA代码中不要出现类似弹窗,但...
    99+
    2022-06-02
    python 子进程 python 关闭excel 弹窗
  • 如何使用Python子进程关闭Excel自动化中的弹窗
    本篇文章为大家展示了如何使用Python子进程关闭Excel自动化中的弹窗,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。利用Python进行Excel自动化操作的过程中,尤其是涉及VBA时,可能遇到...
    99+
    2023-06-15
  • 如何关闭win7智能排序功能不想让窗口自动最大化
      win7的智能排序功能让我们很喜欢,但是有很多人也非常不喜欢这个功能,因为它会自动最大化窗口。有些人xp系统用习惯了根本不想要这个功能。那么怎么样才能关闭智能排序功能。   1、我们可以到注册表里面关闭这个功能   ...
    99+
    2023-06-02
    win7 智能排序 窗口最大化 智能
  • win7自动更新如何关闭不让其有频率的弹出
      win7自动更新可以帮助你更好的防范自己电脑遭受攻击,不过频繁的更新让人觉得厌烦,不知道大家是否和小编有同样的喜好,小编很反感win7的自动更新每次都是关机的时候显示你的系统要更新看着很郁闷,下面小编就教大家怎么关闭...
    99+
    2023-06-12
    win7 自动更新 频率
  • Python的子线程和子进程是如何手动结束的?
    如何结束Python的子线程和子进程 结束子线程的方法: 这个是搬运其他大神的代码,鄙人也不知道原理,反正拿来主义,暂时没发现什么缺点,先用着再说。 import inspect...
    99+
    2024-04-02
  • win7如何优化注册表自动关闭无响应程序
    本文小编为大家详细介绍“win7如何优化注册表自动关闭无响应程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“win7如何优化注册表自动关闭无响应程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。优化方法:按w...
    99+
    2023-06-28
  • 如何关闭xp的自动更新 多种方法关闭xp中的自动更新功能
      自动更新是xp系统中自带的一个自动更新系统补丁的工具,自动更新是很好,但是有时候很麻烦,一些补丁又不是我们想要更新的。于是很多用户就在问如何关闭xp系统中的这个自动更新功能下面我们就来盘点下关闭自动更新的几种方法。 ...
    99+
    2023-06-02
    关闭自动更新 xp 功能 更新 多种 方法
  • python如何进行自动化测试selenium核心技术处理弹框
    python如何进行自动化测试selenium核心技术处理弹框,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。页面上的弹框一般有三种:(1)alert:用来提示(2)confir...
    99+
    2023-06-25
  • win10中1909系统应用自启动如何关闭
    这篇文章给大家分享的是有关win10中1909系统应用自启动如何关闭的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法一:卸载设备中的第三方杀毒、管家、优化软件同时按【Windows 徽标键+R】,输入 【msc...
    99+
    2023-06-10
  • 如何在Excel中调用Python脚本,实现数据自动化处理!
    说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5亿忠实用户,而作为网红语言的Python,也仅仅只有700万的开发人员。Excel是全世界最流行的编程语言。对,你没看错,自从微软引入了LAMBDA...
    99+
    2023-05-14
    Python Excel
  • Linux系统如何关闭不用的进程
    这篇文章将为大家详细讲解有关Linux系统如何关闭不用的进程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文叙述怎么关闭Linux操作系统中的一个进程。打开ubuntu操作系统,ctrl+alt+t -...
    99+
    2023-06-10
  • 如何关闭xp的自动更新以及多种方法关闭xp中的自动更新功能
    如何关闭xp的自动更新以及多种方法关闭xp中的自动更新功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  自动更新是xp系统中自带的一个自动更新系统补丁的工具,自动更新是很好...
    99+
    2023-06-14
  • 如何用Python做自动化特征工程
    机器学习的模型训练越来越自动化,但特征工程还是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理。而特征选取恰恰是机器学习重要的先期步骤,虽然不如模型训练那样能产生直接可用的结果。本文作者将使用Python的featuretools库...
    99+
    2023-01-31
    如何用 特征 工程
  • 如何在linux中使用kill命令关闭进程
    本篇文章给大家分享的是有关如何在linux中使用kill命令关闭进程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命...
    99+
    2023-06-10
  • Python Unittest如何进行自动化的单元测试
    这篇文章将为大家详细讲解有关Python Unittest如何进行自动化的单元测试,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、python 测试框架(本文只涉及 P...
    99+
    2024-04-02
  • JS如何使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能
    这篇文章给大家分享的是有关JS如何使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:HTML部分:<div ...
    99+
    2024-04-02
  • 如何进行自动化测试unitest中case的管理
    这篇文章主要为大家分析了如何进行自动化测试unitest中case的管理的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何进行自动化测试unitest中ca...
    99+
    2023-06-04
  • 微信小程序如何解决自定义弹窗滚动与页面滚动冲突的问题
    这篇文章主要介绍微信小程序如何解决自定义弹窗滚动与页面滚动冲突的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下先看效果是否是自己需要的实现步骤:1.整个布局用作为根节...
    99+
    2024-04-02
  • 如何在实时 Linux Shell 中通过 Python 进行自动化部署?
    Linux Shell 中通过 Python 进行自动化部署是一种高效的方法,可以节省时间和精力。在本文中,我们将介绍如何使用 Python 脚本来自动化部署,并演示如何在实时 Linux Shell 中使用 Python 进行自动化部署。...
    99+
    2023-09-24
    实时 linux shell
  • Python在自动化和脚本编程中的应用
    Python是一种高级编程语言,它具有简单易懂的语法结构和强大的库支持,使其成为许多开发者和工程师首选的编程语言之一。Python在自动化和脚本编程领域有着广泛的应用,本文将探讨Pyt...
    99+
    2024-02-23
    自动化 python 脚本
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作