pywinauto qwidget点击触发无动作

时间:2017-05-20 17:16:54

标签: python windows user-interface pywinauto

很明显按下并释放了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)

代码重复三次,因此可以轻松地将人工干预插入到流程中。 enter image description here

2 个答案:

答案 0 :(得分:1)

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

P.S。我已经下载了这个精简版应用程序,并将在稍后尝试为您做出示例。

答案 1 :(得分:0)

我仍然更喜欢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);
        }
    }
}