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

时间:2011-04-25 01:49:41

标签: python win32gui

使用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 个答案:

答案 0 :(得分:1)

我不是WATSUP用户,但是我使用pywinauto做了类似的事情 - 在我的情况下,我正在运行一些自动化测试,打开各种第三方程序,以类似的方式,抛出不方便的警告对话框。处理你不了解的对话框有点困难,但是如果你确实知道出现了哪些对话框,但是当出现时,你可以启动一个线程来处理这些对话框。 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

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

#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做了类似的事情,没有使用线程,即,查找命名窗口并单击该窗口上的特定按钮。