如何使用 pywinauto check/uncheck ListBox 中的项目?

How do I check/uncheck items in a ListBox with pywinauto?

我正在尝试使用 pywinauto 自动化 Cambium LINKPlanner 应用程序,并找到了几乎所有我需要的控件。但是,有一个带有标识符 'ListBox' 的选中列表框,似乎没有任何方法可以 check/uncheck 列表中的项目。

我可以列出ListBox的内容:

>>> app.LINKPlanner.ListBox.item_texts()
['PMP 450b High Gain', 'PMP 450b Mid-gain', 'PMP450 (retired)', 'PMP450d (retired)', 'PMP450i', 'PMP450i ATEX/HAZLOC']

我可以按名称或位置突出显示列表框中的项目:

>>> app.LINKPlanner.ListBox.select('PMP450i')
<win32_control.ListBoxWrapper - '', ListBox, 70154>
>>> app.LINKPlanner.ListBox.select(2)
<win32_control.ListBoxWrapper - '', ListBox, 70154>

但是我不能check/uncheck列表项中的复选框。

有什么建议吗?

编辑:

根据 Vasily 的建议,我能够看到边界框,然后使用 click_input 单击复选框。

>>> app.LINKPlanner.ListBox.select('PMP 450b High Gain').item_rect(0)
<RECT L0, T0, R276, B17>
>>> app.LINKPlanner.ListBox.select('PMP 450b High Gain').click_input(coords=(9,9))

如果检测为ListBox,可能是owner-drawn复选框,无法单独检测。我建议使用方法 .item_rect(item_name),然后使用方法 .click_input()。方法 .client_to_screen() 也可能有帮助。

我正在使用 .select("item text").send_keys("{SPACE}")

我尝试使用 Vasily 的回答 item_rect()。这可行,但有一些缺点。

在我的例子中 item_rect 不可靠:它总是比实际高 2 到 4 个像素。此错误加起来是连续的项目。我的脚本最终点击了错误的复选框。

此外,如果列表太长,则需要滚动。这需要单独的解决方法。

我发现我的 ListBox 会在按下 space 栏时切换复选框。

所以我改为这样做:

# De-select all (there is a button to do this).
dialog.window(title="Deselect all").click()

# Select the desired items.
for item in ["Item 1 name", "Item 5 name"]:
   dialog.ListBox.select(item)
   dialog.ListBox.type_keys("{SPACE}")