Как не дать диалоговому окну предупреждения остановить выполнение программы на Python, которая его контролирует?

1

Используя 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)
Теги:
win32gui

1 ответ

1

Я не пользователь WATSUP, но я делаю что-то очень похожее с помощью pywinauto - в моем случае я запускаю несколько автоматических тестов, которые открывают различные сторонние программы, которые аналогичным образом вызывают неудобные диалоговые окна предупреждения, Немного сложно справиться с диалоговыми окнами, о которых вы не знаете, однако, если вы знаете, какие диалоги появляются, но не тогда, когда они появляются, вы можете начать поток, чтобы иметь дело с этими всплывающими окнами. Ниже приведен простой пример того, что я делаю, и использует 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 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 делает что-то подобное без использования потоков, т.е. ищет именованное окно и нажимает на определенную кнопку в этом окне.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню