如何阻止警告对话框停止执行控制它的 Python 程序?

Posted

技术标签:

【中文标题】如何阻止警告对话框停止执行控制它的 Python 程序?【英文标题】:How to stop a warning dialog from halting execution of a Python program that's controlling it? 【发布时间】:2011-04-25 01:49:40 【问题描述】:

使用 Win32GUI 和 Watsup,我正在编写一些 Python 代码来自动搜索数据库,该数据库是通过不带有接口的程序访问的。因此,我可以从列表中获取一个字符串,然后将其输入到搜索框中,然后按“查找”。

但是,当搜索返回超过 1000 个结果时,程序会抛出一个警告对话框——它只是一个结果数量的通知——它会停止 Python 代码的执行。我无法让代码越过它按下查找的行。

猜测,这是因为它不需要窗口或知道如何处理警告——但我也不知道,除了手动接受它。下面是相关的代码示例,尽管它可能不是很有启发性。在“clickButton(LookupButton)”之后,执行停止。

LookupButtonlocation = elemstring.find("Lookup", AuthNameFieldlocation) - 15

#Use Regex search to find handles
number_regex = re.compile(';(\d+);')
AuthNameEdit = int(number_regex.search(elemstring[AuthNameFieldlocation:]).group(1))
LookupButton = int(number_regex.search(elemstring[LookupButtonlocation:]).group(1))

#Input new Author into Edit Field
setEditText(AuthNameEdit, "John Campbell")
#Click lookup button
clickButton(LookupButton)

【问题讨论】:

【参考方案1】:

我不是 WATSUP 用户,但我使用 pywinauto 做了一些非常相似的事情 - 在我的情况下,我正在运行许多自动化测试,这些测试会打开各种 3rd 方程序,这些程序以类似的方式抛出不方便的警告对话框.处理你不知道的对话框有点困难,但是如果你知道出现了哪些对话框,但不知道它们出现的时间何时,你可以启动一个线程来处理那些弹出- UPS。以下是我正在做的一个简单示例,它使用 pywinauto,但您可以针对 WATSUP 调整该方法:

import time
import threading

class ClearPopupThread(threading.Thread): 
    def __init__(self, window_name, button_name, quit_event):
        threading.Thread.__init__(self)
        self.quit_event = quit_event
        self.window_name = window_name
        self.button_name = button_name
    def run(self):
        from pywinauto import application, findwindows                
        while True:
            try:
                handles = findwindows.find_windows(title=self.window_name)
            except findwindows.WindowNotFoundError:
                pass #Just do nothing if the pop-up dialog was not found
            else: #The window was found, so click the button
                for hwnd in handles:
                    app = application.Application()
                    app.Connect(handle=hwnd)
                    popup = app[self.window_name]                    
                    button = getattr(popup, self.button_name)
                    button.Click()                    
            if self.quit_event.is_set():
                break            
            time.sleep(1) #should help reduce cpu load a little for this thread

本质上,这个线程只是一个无限循环,按名称查找弹出窗口,如果找到,它会单击按钮关闭窗口。如果您有许多弹出窗口,您可以在每个弹出窗口中打开一个线程(不过,这个错误并不过分高效)。因为它是一个无限循环,所以我让线程查看是否设置了事件,以允许我从主程序中停止线程。所以,在主程序中我做了这样的事情:

#Start the thread
quit_event = threading.Event()
mythread = ClearPopupThread('Window Popup Title', 'Yes button', quit_event)
# ...
# My program does it's thing here
# ...
# When my program is done I need to end the thread
quit_event.set()

这不一定是解决您的问题的唯一方法,但对我来说是一种有效的方法。抱歉,我在处理 WATSUP 方面帮不上什么忙(我总是发现 pywinauto 更容易使用),但我注意到在 WATSUP 主页 (http://www.tizmoi.net/watsup/intro.html) 上,示例 2 在不使用线程的情况下做了类似的事情,即看起来为命名窗口,然后单击该窗口上的特定按钮。

【讨论】:

以上是关于如何阻止警告对话框停止执行控制它的 Python 程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 __init__ 语句中(或之后)停止 QDialog 的执行?

为啥警告框中会出现“阻止此页面创建其他对话框”?

如何阻止 Selenium 中的 Invalid Length 警告发生?

如何在linux中使用Python的警告对话框?

尝试打开无效/无法访问的 URI 时如何阻止 fopen 触发警告

如何从 C# 控制台停止办公应用程序 [重复]