【问题标题】:pywinauto wait for window to appear and send key-presspywinauto 等待窗口出现并发送按键
【发布时间】:2015-07-12 11:46:47
【问题描述】:

我正在尝试制作一个小功能,它会等到某个窗口出现然后发送按键 (alt+i),我一直在尝试使用 pywinauto 执行此操作,但没有成功。 根据我在文档中读到的内容,我可以使用

pywinauto.application.WindowSpecification.Exists()

但我只是不明白如何指定我要查找的内容,我可以使用窗口标题或进程名称,但找不到很好的解释。

另外,除了 pywinauto 之外,还有没有更容易使用的模块?我不需要做复杂的自动化,只需等待一个窗口并发送一些密钥。

编辑

好的,我找到了一个解决方案,一个永远循环的简单函数

 def auto_accept(*args):
    while True:
        try:
            app = pywinauto.Application()
            app.window_(title='Untitled - Notepad').SetFocus()
            app.window_(title='Untitled - Notepad').TypeKeys("{1}{2}{3}")
        except (pywinauto.findwindows.WindowNotFoundError, pywinauto.timings.TimeoutError):
            pass

但现在我总是收到类似“2015-07-13 12:18:02,887 INFO: Typed text to the Notepad: {1}{2}{3}”的警告,我无法使用警告模块,还有另一种过滤\禁用它们的方法吗?这是一个问题,因为当我使用 py2exe 创建 exe 时,程序关闭后它告诉我有错误,但唯一的错误是我从 sendkeys 收到的警告。

【问题讨论】:

    标签: python pywinauto


    【解决方案1】:

    您可以简单地为WindowSpecification 对象使用wait/wait_not 方法:

    from pywinauto.application import Application
    app = Application(backend="win32").start('executable')
    app.WindowSpecification.wait('enabled').type_keys('%i') # % - alt, ^ - ctrl
    

    WindowSpecification可以设置更多细节:

    app.window(title='Title', class_name='#32770')
    

    window() 方法的所有可能参数与for find_elements function 相同(不建议直接使用此低级函数)。

    对于长时间操作,您可以为单个等待设置超时:wait('enabled', timeout=20) 或为每个wait 全局设置超时:Timings.window_find_timeout = 10


    编辑:在import pywinauto 之后调用此代码以禁用日志记录:

    import logging
    logger = logging.getLogger('pywinauto')
    logger.level = logging.WARNING # or higher
    

    记录器级别:

    Level Numeric value 
    CRITICAL 50 
    ERROR 40 
    WARNING 30 
    INFO 20 
    DEBUG 10 
    NOTSET 0 
    

    【讨论】:

    • 谢谢,但我找到了一个可行的解决方案,另一方面,我如何禁用发送击键时收到的警告?我总是收到类似“2015-07-13 12:18:03,100 INFO: Typed text to the Notepad: {1}{2}{3}”的警告,我无法使用警告模块将它们过滤掉。跨度>
    • 因为它是日志模块的东西。更新了答案以涵盖这一点。
    • pywinauto 0.5.1 将有一个记录在案的快捷方式:pywinauto.actionlogger.disable() 感谢您的用例。
    • 有没有办法永远等待?我的对话框是在外部创建的。当前使用的值非常大。
    • 另一种方法要复杂得多。您需要挂钩 WM_CREATE 事件。这不是几句话就能解释的。我们计划在 pywinauto 中实现 nice hook API,但 ETA 未知。
    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多