1

我有一段 pywinauto 代码,它试图从 ItemList 中删除一个 Item。有时 type_keys() 不起作用,就好像窗口失去焦点一样。有趣的是,如果我单击运行 python 代码的命令提示符窗口,这会突然触发代码正确设置应用程序的焦点并继续运行。

以下是这些步骤的概述:

  1. 在特定应用程序中打开一个 Open Diaglog 窗口
    (此处为 Tradestation 的开发环境)
  2. 从 ItemList 中选择一个项目
  3. 键入 DELETE 键(弹出确认窗口)
  4. 在确认窗口中选择“是”

大多数情况下,此序列都有效,除了偶尔(可能每 5 次左右尝试中的 1 次)它会在没有发生 DELETE 键按下的情况下失败。该项目被选中,但窗口出现失焦(或看起来如此)。

我一直在追逐这个问题几天/几周,尝试各种不同的东西,即增加延迟,调整超时,调整 pywinauto.Timings.fast/slow,尝试在各个地方设置焦点等等......我也把代码放入一个无限的“while”循环,希望它能在后续尝试中起作用。

有趣的是,当它卡住时,如果我单击运行 python 应用程序的 Windows 命令提示符窗口,然后突然打开对话框框重新聚焦并继续成功运行。

我正在寻找有关根本原因的建议或我可以尝试的其他方法。

这是代码结束的地方:

strategy = self.window.child_window(title=name, control_type='ListItem')
Timings.slow()
while True:
    # Issues where delete/confirm window not showing
    # Try solving with SetFocus in case the open diag is going out of focus
    _logger.info("Set focus")
    handle = win32gui.FindWindow(None, OPEN_DLG_TITLE)
    win32gui.SetForegroundWindow(handle)

    # Highlight the strategy
    _logger.info("Select Strategy")
    strategy.select()
    if strategy.is_selected() == 0:
        time.sleep(2)
        continue
    _logger.info("Strategy selected")

    # Delete it...
    _logger.info("Type DELETE")
    #strategy.type_keys('{DELETE}')                
    strategy.type_keys('{DELETE}', set_foreground=False)

    # Delay in case return comes back too quickly
    time.sleep(2)

    # Click 'Yes' in Confirmation Window
    _logger.info("Check confirmation window")
    confirm_window = self.window.child_window(
        title="Confirm file removal",
        control_type="Window"
    )
    if confirm_window.exists() is False:
        try:
            _logger.info('... does not exist.  Briefly wait 5 seconds')
            confirm_window.wait('exists', timeout=5)
        except pywinauto.timings.TimeoutError:
            #breakpoint()
            _logger.info('---- Retrying -----')
            continue
    assert confirm_window.exists() is True

    break
Timings.fast()

4

0 回答 0