【问题标题】:pywinauto qwidget click triggers no actionpywinauto qwidget 点击触发无动作
【发布时间】:2017-10-20 16:32:25
【问题描述】:

很明显QWidget按钮被按下和释放,不幸的是没有触发任何动作。

环境类似于find qwidget object text by using pywinauto。该代码使用来自How to click a 'next' button of a window using python 的绝对坐标。

程序运行后,目标窗口将获得焦点。光标开始靠近目标窗口的中心。然后它移动到按钮,按下按钮,因为颜色变为向下颜色。然后释放按钮,光标移回窗口中心。只缺少一件事,目标窗口应用程序没有采取任何行动。

有一个解决方法:如果我将鼠标移动到窗口的标题并在正确的时间单击,则自动单击按钮将触发实际动作。这让我对为什么会发生这种情况感到困惑,并且无法考虑解决方案。

app1 = Application()
app1.connect(title_re='^Quartus Prime Programmer.*$')
app1.QWidget.print_control_identifiers()

win1 = app1.QWidget
rect1 = win1.rectangle()
coor1 = (rect1.left+64,rect1.top+350) # 64, 350: "add file"
win11 = win1.TopLevelParent()
for i in range(3):
    win11.SetFocus()
    win11.PressMouseInput(coords=coor1)
    time.sleep(1.3)
    win11.ReleaseMouseInput()
    time.sleep(3.0)

代码重复了 3 次,因此可以轻松地将人工干预插入到流程中。

【问题讨论】:

  • 注意到这个关于 UAC stackoverflow.com/questions/33254091/… 但认为这无关紧要。
  • 是的,您找到的答案有点过时了。 :) pywinauto 0.6.0 于 2016 年底发布,最近进行了一些更新。
  • 嗯...该应用看起来像部分支持 MSAA 的旧 Qt4 应用。您可以在Inspect.exe 中看到许多控件,但其中许多控件不可用。

标签: python windows user-interface pywinauto


【解决方案1】:

Qt 应用程序可以使用Application(backend='uia') 实现自动化。请阅读专为具有新后端的 pywinauto 0.6.0+ 编写的 Getting Started Guide。它解释了核心概念和许多有用的技巧。

附:我已经下载了这个精简版应用程序,稍后会尝试为您制作示例。

【讨论】:

  • app = Application(backend='uia') 有效,然后下一行 app.connect(title_re='^Quartus Prime Programmer.*$') 失败。你有没有尝试过?感谢您的参与。
  • 我看到你在这个问题下发表了评论。非常感谢您的努力!
【解决方案2】:

我仍然更喜欢 python 或 pywinauto 中的解决方案。这是使用 java 机器人的临时解决方法,只是为了让它运行。 python 将通过命令行java -jar TestQuartusClick.jar 64 350 1 调用它,其中64 350 1 是坐标和调用参考号。

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.util.logging.Level;
import java.util.logging.Logger;

public class TestQuartusClick {
    public static void main(String[] args){
        int x = 0, y = 0, fn = 0;
        if ( args.length == 3 ) {
            x = Integer.parseInt(args[0]);
            y = Integer.parseInt(args[1]);
            fn = Integer.parseInt(args[2]); /* reference */
        } else {
            System.out.println("java error args size not 3");
            return;
        }
        System.out.println(String.format(
                "java input %d %d %d", x, y, fn));
        Robot bot;
        try {
            bot = new Robot();
            int mask = InputEvent.BUTTON1_DOWN_MASK;
            bot.mouseMove(x, y);
            bot.mousePress(mask);
            bot.mouseRelease(mask);
            System.out.println(String.format(
                    "java clicked %d %d %d", x, y, fn));
        } catch (AWTException ex) {
            System.out.println(String.format(
                    "java error click %d %d %d", x, y, fn));
            //Logger.getLogger(TestQuartusClick.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 2021-06-30
    • 2018-02-13
    • 2011-04-30
    • 2013-03-21
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多