Как нажать кнопку в MS Access с Python - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь автоматизировать извлечение некоторых данных из запроса базы данных MS Access (.accdb).

Я использую win32com, чтобы открыть базу данных Access, и я получил всю информацию о виджетах, которые я хочу взаимодействовать с. Я могу изменять значения виджетов и открывать формы, читать и создавать запросы, хотя я не знаю, как нажимать кнопку (CommandButton).

Мой код прост и выглядит примерно так:

import win32com.client as win

access = win.Dispatch('Access.Application')
access.Visible = True
db = access.OpenCurrentDatabase(r'databasepath.accdb')
app.DoCmd.OpenForms(formname)

и затем я могу сослаться на все виджеты, с которыми я хочу взаимодействовать, через:

widget = app.Forms(formname).Controls(widgetname)

Как я могу нажать CommandButton после того, как я на него ссылаюсь? Я проверил документацию MS Access для Command Object, но нет метода щелчка. Обходное решение, которое я использую:

widget.SetFocus()
shell.SendKeys('{Enter}') #it refers to WScript.Shells

Но я не хочу использовать SendKeys, потому что он может легко генерировать ошибку, например, если пользователь работает над чем-то другим. Я также решил прочитать запрос SQL, который связан с нажатием кнопки, чтобы изучить другой обходной путь, хотя я оставляю его как последний вариант.

1 Ответ

1 голос
/ 30 апреля 2020

Просто вызовите событие триггера как свойство формы. Однако убедитесь, что в MS Access кнопка определена как Public, а не Private, как в: Public Sub myButton_Click(). И, конечно же, при любой интеграции API обязательно включите try/except для чистого освобождения ресурсов, ошибка или нет:

import win32com.client as win

try:
    access = win.Dispatch('Access.Application')
    db = access.OpenCurrentDatabase(r'C:\Full\Path\To\myDatabase.accdb')
    access.DoCmd.OpenForms(formname)

    # RUN BUTTON CLICK EVENT (OPEN PARENTHESES REQUIRED)
    access.Forms(formname).myButton_Click()

    access.Visible = True

except Exception as e:
    print(e)
    access.DoCmd.CloseDatabase()
    access.Quit()

finally:
    db = None; access = None
    del db; del access
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...