Pywinauto无法点击右键子菜单:点击「发送到」后无法定位BTDecoder
解决Pywinauto无法点击「发送到」子菜单中BTDecoder的问题
我来帮你搞定这个Pywinauto的菜单点击问题!你遇到的MatchError本质是因为点击「发送到」后弹出的子菜单,并不属于原来右键主菜单的子控件,而是一个独立的桌面菜单窗口,所以用app.ContextMenu.child_window会找不到目标项。下面给你几个可行的解决方案:
方案一:用menu_select直接触发菜单路径(最推荐)
Pywinauto提供了menu_select方法,可以直接通过菜单层级路径来选择,不需要手动分步点击,能自动处理菜单的弹出和层级关系,稳定性更高。修改后的代码如下:
from pywinauto import Application app = Application(backend="uia").connect(path="explorer.exe", title="FW") # 定位目标文件 common_files = app.FW.ItemsView.get_item('WRT_FW_6_3_2019_10_37_56_multi_core_000001.etl') common_files.set_focus() # 右键点击文件,然后直接通过路径选择菜单项 common_files.right_click_input() app.ContextMenu.menu_select("Send to->BTDecoder")
如果运行时提示找不到路径,你可以先打印右键菜单的所有控件标识符,确认「Send to」和「BTDecoder」的准确文本:
common_files.right_click_input() app.ContextMenu.print_control_identifiers()
根据输出的文本调整menu_select里的路径即可。
方案二:手动定位「发送到」子菜单窗口
如果方案一不适用,你可以手动定位「发送到」弹出的子菜单窗口(它属于Desktop层级,而非原右键菜单)。代码如下:
from pywinauto import Application, Desktop app = Application(backend="uia").connect(path="explorer.exe", title="FW") common_files = app.FW.ItemsView.get_item('WRT_FW_6_3_2019_10_37_56_multi_core_000001.etl') common_files.set_focus().click_input(button='left') common_files.click_input(button='right') # 等待右键主菜单出现并点击「Send to」 app.ContextMenu.wait('visible', timeout=10) send_to_menu = app.ContextMenu.child_window(title="Send to", control_type="Menu") send_to_menu.click_input() # 定位「发送到」的子菜单(属于Desktop窗口) desktop = Desktop(backend="uia") send_to_submenu = desktop.window(title="Send to", control_type="Menu") send_to_submenu.wait('visible', timeout=10) # 点击BTDecoder(如果auto_id无效,就只用title和control_type) send_to_submenu.child_window(title="BTDecoder", control_type="MenuItem").click_input()
为什么原来的代码会报错?
你之前的代码里,点击「Send to」后仍然尝试从app.ContextMenu里找子项,但实际上「发送到」的子菜单是一个独立的窗口,挂载在Desktop下,而非原右键菜单的子控件,所以自然找不到「BTDecoder」。
内容的提问来源于stack exchange,提问作者Ashwini Rai
相关产品推荐
相关产品推荐

