如何用pywinauto在Python IDLE中set_text并解决控件匹配错误
解决pywinauto控制Python IDLE无法输入及控件识别错误的问题
问题描述
我希望用pywinauto控制Python IDLE,能启动IDLE但无法输入文本。我的代码如下:
import pywinauto app = pywinauto.application.Application(backend="uia").start(r"C:\Python37\pythonw.exe C:\Python37\Lib\idlelib\idle.pyw") app2 = pywinauto.application.Application().connect(process=app.process)
尝试使用app2.Property.print_control_identifiers()时返回报错:
Traceback (most recent call last): File "C:\Python37\lib\site-packages\pywinauto\application.py", line 256, in __resolve_control criteria) File "C:\Python37\lib\site-packages\pywinauto\timings.py", line 458, in wait_until_passes raise err pywinauto.timings.TimeoutError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> app2.Property.print_control_identifiers() File "C:\Python37\lib\site-packages\pywinauto\application.py", line 595, in print_control_identifiers this_ctrl = self.__resolve_control(self.criteria)[-1] File "C:\Python37\lib\site-packages\pywinauto\application.py", line 259, in __resolve_control raise e.original_exception File "C:\Python37\lib\site-packages\pywinauto\timings.py", line 436, in wait_until_passes func_val = func(*args, **kwargs) File "C:\Python37\lib\site-packages\pywinauto\application.py", line 201, in __get_ctrl dialog = self.backend.generic_wrapper_class(findwindows.find_element(**criteria[0])) File "C:\Python37\lib\site-packages\pywinauto\findwindows.py", line 84, in find_element elements = find_elements(**kwargs) File "C:\Python37\lib\site-packages\pywinauto\findwindows.py", line 303, in find_elements elements = findbestmatch.find_best_control_matches(best_match, wrapped_elems) File "C:\Python37\lib\site-packages\pywinauto\findbestmatch.py", line 533, in find_best_control_matches raise MatchError(items = name_control_map.keys(), tofind = search_text) pywinauto.findbestmatch.MatchError: Could not find 'Property' in 'dict_keys(['*Python 3.7.2 Shell*TkTopLevel', '*Python 3.7.2 Shell*', 'TkTopLevel'])'
解决方案
1. 避免混用多个Application实例与不同Backend
你创建了两个Application对象,第一个使用backend="uia",第二个用默认的win32,这会导致控件识别逻辑不一致。而且启动IDLE后直接用第一个app对象操作即可,完全不需要额外connect。
2. 修正控件名称错误
报错的核心原因是你尝试访问app2.Property,但这个控件名称根本不存在。从报错信息里的控件列表可以看到,主窗口的标识是*Python 3.7.2 Shell*TkTopLevel,你需要先获取这个主窗口,再调用print_control_identifiers()查看所有可用控件。
3. 完整可运行代码示例
import pywinauto from pywinauto import timings # 延长应用启动超时时间,确保IDLE完全加载 timings.TIMEOUTS['app_start_timeout'] = 10 # 使用uia backend启动IDLE(适配Tkinter架构的IDLE) app = pywinauto.application.Application(backend="uia").start(r"C:\Python37\pythonw.exe C:\Python37\Lib\idlelib\idle.pyw") # 通过标题正则匹配获取主窗口 main_window = app.window(title_re="Python 3.7.2 Shell") # 打印所有控件标识符,方便定位输入框(执行后可以在控制台看到所有控件信息) main_window.print_control_identifiers() # 根据打印结果定位输入控件(IDLE的输入框通常是Text类,标题为"Python Shell") input_box = main_window.child_window(class_name="Text", title="Python Shell") # 等待输入框就绪,然后模拟键盘输入 input_box.wait('ready', timeout=5) input_box.type_keys("print('Hello from pywinauto!'){ENTER}")
4. 关键注意事项
- IDLE基于Tkinter开发,
uiabackend比默认的win32更适合识别它的控件; - 必须在主窗口对象上调用
print_control_identifiers(),而不是在app对象上使用不存在的控件名; - 使用
type_keys()可以模拟完整的键盘操作,包括{ENTER}这类特殊按键。
内容的提问来源于stack exchange,提问作者Chan
相关产品推荐
相关产品推荐

