You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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开发,uia backend比默认的win32更适合识别它的控件;
  • 必须在主窗口对象上调用print_control_identifiers(),而不是在app对象上使用不存在的控件名;
  • 使用type_keys()可以模拟完整的键盘操作,包括{ENTER}这类特殊按键。

内容的提问来源于stack exchange,提问作者Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:27:49