Python+AutoIt实现界面工具开发过程详解


Posted in Python onAugust 07, 2019

前言

不同于Linux服务器上的命令行操作,在windows系统上用户的使用习惯还是倾向于使用有界面的工具。如果工具是命令行交互操作的方式,可能是有悖于在windows上使用的操作习惯,往往不容易推广使用。

由于需要维护测试部工具的原因,其中有一个工具是用AutoIt语言实现的,利用几天时间把工具源码学习了一下。发现使用AutoIt可以快速开发工具界面。当然它也能各种逻辑处理,而且也很方便。

但是考虑精力和学习成本,我主要使用AutoIt的方式还是利用它来实现界面开发以及学习基本的语法完成简单的逻辑处理,然后使用Python实现核心的业务处理逻辑。通过AutoIt调用函数执行Python编译后的可执行文件方式来完成工具需求的开发。

我想,本文最适合的读者是跟我一样有界面开发困难障碍的同学,又不想花太多时间去学其他界面实现开发的同学。这种方法有点投机取巧,不过是我恰好其他工具使用到了AutoIT,所以结合了使用。总的来说还是建议初学者学习使用Python界面工具开发,如PyQt。因为学习都是要精力和成本的。本文仅是提供一种思路。

AutoIt简述

AutoIt一个使用类似BASIC脚本语言的免费软件,语言简单、开发工具安装方便,帮助手册内容丰富。它设计用于Windows GUI(图形用户界面)中进行自动化操作。AutoIt官网: https://www.autoitscript.com/site/autoit  。

下面内容来自官网的介绍,如下:

Python+AutoIt实现界面工具开发过程详解

AutoIt工具安装

Auto工具从官网下载:https://www.autoitscript.com/site/autoit/downloads/。这里要注意的一点是要安装全量的AutoIt编辑器。把如下两个软件下载,安装步骤按照提示默认操作就可以完成。如果只安装第1个,就会缺少本文需要使用的Koda(FormDesigner)菜单栏。

Python+AutoIt实现界面工具开发过程详解

安装完成后,打开SciTE编辑器。检查是否包含Koda(FormDesigner)。路径:菜单栏Tools -> Koda(FormDesigner)。这就是AutoIt界面画图的工具,通过拖拽工具栏中的组件到主界面就可以实现。

Python+AutoIt实现界面工具开发过程详解

AutoIt界面绘制和对齐

AutoIt界面实现就是通过Koda(FormDesigner)界面中windows控件拖拽的主窗口中实现。Standard中有常用的windows窗体控件,包括Label、input、Edit、Button、CheckBox、RadioButton、ListBox、ComboBox、Contex Menu

Python+AutoIt实现界面工具开发过程详解

将需要的界面控件拖拽到主界面窗口后,就需要将按照实际需要对齐窗口。如下主界面有3个Lable标签和3个Input输入框。

Python+AutoIt实现界面工具开发过程详解

对齐方法为按住Shift键同时选中需要对齐操作的按钮,主要对齐方式如下):

Python+AutoIt实现界面工具开发过程详解

对齐方式的描述都有小图形,挺形象的,应该都知道每个对齐方式的作用了。可以自己拉几个控件下来,每个尝试一下看看效果。最终就能获取你想要的了。

当控件对齐完成之后。可以执行Tools -> Generate Form Code获取代码用于后续的编辑了。如下

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section 
$Form1_1 = GUICreate("文件名替换工具", 446, 198, 218, 133)
$Label1 = GUICtrlCreateLabel("路径", 40, 32, 28, 17)
$Label2 = GUICtrlCreateLabel("旧字符串", 40, 80, 52, 17)
$Label3 = GUICtrlCreateLabel("新字符串", 40, 128, 52, 17)
$Input1 = GUICtrlCreateInput("", 120, 32, 257, 21)
$Input2 = GUICtrlCreateInput("", 120, 80, 257, 21)
$Input3 = GUICtrlCreateInput("", 120, 128, 257, 21)
$Button1 = GUICtrlCreateButton("确定", 112, 160, 57, 25)
$Button2 = GUICtrlCreateButton("退出", 224, 160, 65, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
  $nMsg = GUIGetMsg()
  Switch $nMsg
    Case $GUI_EVENT_CLOSE
      Exit

    Case $Label1
    Case $Label2
    Case $Label3
  EndSwitch
WEnd

AutoIt获取界面输入和调用外部命令

实现AutoIt界面,最主要是利用界面让用户输入相关的参数。那么程序中如何获取用户的输入?主要是通过GUICtrlRead()函数,如需要获取上述界面中用户输入的路径、旧字符串、新字符串。代码如下:

$file_path = GUICtrlRead($Input1)
$old_str = GUICtrlRead($Input2)
$new_str = GUICtrlRead($Input3)

获取到用户的输入参数后就可以将参数传递给Python实现的业务逻辑了。AutoIt可以利用Run()函数调用外部命令。如Run("notepad.exe", "", @SW_SHOWMAXIMIZED)。在使用Run()调用之前可以利用Pyinstaller工具将Python业务处理逻辑.py文件编译成可直接运行的.exe文件(编译方法可以参考使用Pyinstaller转换.py文件为.exe可执行程序)。这样就可以直接使用Run()函数调用实现了。

调用的外部程序获取参数的2种常见方式

1、界面输入参数少(0~3个)。如果界面输入参数很少,可以直接通过传参的方式完,注意观察下述调用AutoIt变量的方法。参考代码如下:

Run(@ComSpec & " /c " & "D:\temp\dist\process.exe " & '"'&$old_str&'"' & " " & '"'&$new_str&'"' & " " & '"'&$file_path&'"' ,"")

2、界面输入参数多(比如大于3个)

建议可以采用配置文件方式写入到.ini文件中。然后Python通过读取配置文件方式获取输入。AutoIt将参数写入.ini文件有现成的函数,非常方便。IniWrite()函数原型如下:

IniWrite ( "filename", "section", "key", "value" )

获取外部程序输出结果的2种方式

1、通过StdoutRead()函数获取。这种方式获取输出不稳定,可能是我没掌握到关键点。示例如下:

$op = Run(@ComSpec & " /c " & "D:\temp\dist\process.exe " & '"'&$old_str&'"' & " " & '"'&$new_str&'"' & " " & '"'&$file_path&'"' ,"",@SW_HIDE,$STDOUT_CHILD + $STDERR_CHILD)
$strResult = ""
while 1
  $line = StdoutRead($op)
  if @error Then ExitLoop
  $strResult = $strResult & $line
WEnd
ConsoleWrite($strResult)

2、调用ipconfig命令并将结果输出到文件,AutoIT通过读取文件内容获取。示例如下

$strResult = ""
Local $ipconfig_result_file = @ScriptDir & "\ipconfig_result_file.txt"
ConsoleWrite(@ComSpec & " /c " & "ipconfig > " & '"'&$ipconfig_result_file&'"')
RunWait(@ComSpec & " /c " & "ipconfig > " & '"'&$ipconfig_result_file&'"', "",@SW_HIDE)
$fp = FileOpen($ipconfig_result_file, 0)
if $fp <> -1 Then
 While 1
  $line= FileReadLine($fp)
  If @error = -1 Then ExitLoop
  $strResult = $strResult & $line & @CR
 Wend
EndIf
FileClose($fp)
ConsoleWrite($strResult)

写在最后

本文为界面开发实现有困难的(如本人)同学提供一种可以快速实现界面开发的思路。针对AutoIt语言个人也是现学现用,没有太多的深入研究。另外AutoIt开发工具小巧、安装方便、且AutoIt帮助手册中有所有函数定义和使用的非常详细介绍,有兴趣的同学可以了解一下。上手很容易。最后针对AutoIt+Python实现界面工具开发的总结步骤主要为:

1、利用ScitTe编辑器中的Koda FormDesigner组件拖拽、对齐快速实现界面原型开发。并将界面原型反向生成获取源码。

2、利用Python实现核心业务逻辑处理,通过pyinstaller将.py文件转换成可直接运行.exe文件。

3、利用GUICtrlRead()函数获取用户界面输入,利用Run()函数调用.exe程序并将参数传递进去,实现业务处理。

4、工具开发完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python计算三维矢量幅度的方法
Jun 15 Python
Python实现购物系统(示例讲解)
Sep 13 Python
python实现网页自动签到功能
Jan 21 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
python求绝对值的三种方法小结
Dec 04 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Django静态资源部署404问题解决方案
May 11 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
Python 如何定义匿名或内联函数
Aug 01 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
python 下载m3u8视频的示例代码
Nov 11 Python
python tqdm库的使用
Nov 30 Python
Django中的用户身份验证示例详解
Aug 07 #Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
Aug 07 #Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 #Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 #Python
python中的&amp;&amp;及||的实现示例
Aug 07 #Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 #Python
python代码实现逻辑回归logistic原理
Aug 07 #Python
You might like
PHP编码规范的深入探讨
2013/06/06 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python中列表元素连接方法join用法实例
2015/04/07 Python
python实现BackPropagation算法
2017/12/14 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python global和nonlocal用法解析
2020/02/03 Python
如何基于线程池提升request模块效率
2020/04/18 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
信息管理员岗位职责
2013/12/01 职场文书
自主招生自荐信指南
2014/02/04 职场文书
大学生就业自荐书
2014/06/16 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
撤诉申请怎么写
2015/05/19 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS