如何使用 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}")
我正在尝试使用 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}")