Python IDLE清空窗口

使用Python IDLE时发现并没有清空当前窗口的快捷键,也没有像 clear 这样的命令,使用非常不便。

新建一个 ClearWindow.py脚本,源码如下:

“””

Clear Window Extension
Version: 0.2

Author: Roger D. Serwy
roger.serwy@gmail.com

Date: 2009-06-14

It provides “Clear Shell Window” under “Options”
with ability to undo.

Add these lines to config-extensions.def

[ClearWindow]
enable=1
enable_editor=0
enable_shell=1
[ClearWindow_cfgBindings]
clear-window=

“””

class ClearWindow:

menudefs = [
(‘options’, [None,
(‘Clear Shell Window’, ‘<>’),
]),]

def __init__(self, editwin):
self.editwin = editwin
self.text = self.editwin.text
self.text.bind(“<>”, self.clear_window2)

self.text.bind(“<>”, self.undo_event) # add=”+” doesn’t work

def undo_event(self, event):
text = self.text

text.mark_set(“iomark2”, “iomark”)
text.mark_set(“insert2”, “insert”)
self.editwin.undo.undo_event(event)

# fix iomark and insert
text.mark_set(“iomark”, “iomark2”)
text.mark_set(“insert”, “insert2”)
text.mark_unset(“iomark2”)
text.mark_unset(“insert2”)

def clear_window2(self, event): # Alternative method
# work around the ModifiedUndoDelegator
text = self.text
text.undo_block_start()
text.mark_set(“iomark2”, “iomark”)
text.mark_set(“iomark”, 1.0)
text.delete(1.0, “iomark2 linestart”)
text.mark_set(“iomark”, “iomark2”)
text.mark_unset(“iomark2”)
text.undo_block_stop()
if self.text.compare(‘insert’, ‘<', 'iomark'):
self.text.mark_set('insert', 'end-1c')
self.editwin.set_line_and_column()

def clear_window(self, event):
# remove undo delegator
undo = self.editwin.undo
self.editwin.per.removefilter(undo)

# clear the window, but preserve current command
self.text.delete(1.0, "iomark linestart")
if self.text.compare('insert', '<', 'iomark'):
self.text.mark_set('insert', 'end-1c')
self.editwin.set_line_and_column()

# restore undo delegator
self.editwin.per.insertfilter(undo)

拷贝ClearWindow.py文件,放在Python安装目录Python XXX\Lib\idlelib下面(XXX为你的python版本,比如2.7)。

记事本打开Python XXX\Lib\idlelib目录下的config-extensions.def(IDLE扩展的配置文件), 为防止出错,你可以在打开它之前先copy一个备份 。

修改config-extensions.def ,在末尾添加如下内容,然后保存退出:

1[ClearWindow]
2enable=1
3enable_editor=0
4enable_shell=1
5[ClearWindow_cfgBindings]
6clear-window=

打开Python的IDLE,options选项中就可以看到增加了Clear shell window ctrl+;。

在IDLE输入代码,然后按Ctrl+;(是指Ctrl和;),发现刚输入代码可以被清除了。

快捷键Ctrl+;,可修改成其他键,将

clear-window=

里的Control和;修改成其他键即可。

评论:

weixin_41999529
张一旻:有效,谢谢分享,刚开始没有注意大小写没有成功,后来又看了下就弄好了,看来还是得细心啊!
1
qq_42113166
不会打代码的马卡榕:需要注意的是拷贝的文件名必须一字不落
1
qq_42113166
不会打代码的马卡榕回复Do Better:大小写文件名都不能错。多多琢磨琢磨会装上的。
weixin_41234001
Do Better回复:为什么我没用
qq_26842165
一入辕门深四海:去掉分号就可以了
Python_study_z
Python_study_z:为什么我按博主的方法操作了一遍却没有用,options里也没有多东西,是需要注意什么吗?
Syntax_Error_
Syntax_Error_:感谢分享!
qq_44872514
Hush_s:感谢分享!
qq_42172639
我似乎很高兴:THANK YOU SO MUCH
houyuqing941201
houyuqing941201:博主,config-extensions.def文件用python打开时,闪退,添加不了末尾内容,是怎么回事呀
weixin_49215170
捞一个月亮回复:都说了用记事本打开
Nightwatch1998
huyadish:太感谢了
qq_42790989
qq_42790989:具体想要改成哪个快捷键怎么改啊
it520444
it520444:亲测有效
wang342626
菜鸟成长之路-wei:感谢楼主
LyqOwen
Lnggin:不错,实测有效,谢谢博主
u011301598
风云雄霸:亲测有效,请注意文件名的大小写必须保持一致。
qq_42113166
不会打代码的马卡榕:亲测有效

Android应用的几种开发方式

1、前言
自苹果 iOS 和谷歌 Android 操作系统发布以来,在互联网界就多了一个新名词:App(意为运行在智能移动终端上的第三方应用程序)。

*初的 App 有两种形式:一种是基于本地(操作系统)运行的 App,称之为原生App,或者Native App;一种是基于浏览器运行的 Web App,同样是安装在手机上。因为本地 App 位于平台层上方,向下访问和兼容的能力比较好一些,可以支持在线或离线,消息推送或本地资源访问,摄像、拨号功能的调取。但是由于设备碎片化,本地 App 的开发成本很高,维持多个版本的更新升级也很麻烦。

随着 HTML5 的出现,基于 HTML5 低成本跨平台开发优势又兼具本地 App 特质的混合模式移动应用( Hybrid App) 迅速兴起。它大幅降低了 App 的开发成本,可以通过现有应用商店模式发行,在用户桌面形成独立入口等等。 Hybrid App 已成为开发 App 不错的选择,是未来移动应用开发的趋势。

2、原生App的开发方法
以开发工具的不同来分类,原生 App 的开发方式有两种:Eclipse + ADT 和 Android Studio。

Eclipse + ADT
Eclipse + ADT 的开发方式是曾经Android开发者*好的选择,也是谷歌官方所支持的。但是2013的Google I/O 大会上,Google官方曝光一款新的开发工具 Android Studio,并在2014年底正式推出自家的IDE Android Studio1.0,2016年11月2日,Google Android Developer 官博发文,宣告停止对 Eclipse ADT 的支持。

由于现在市场上的书籍和视频教程,包括很多项目和源码*大多数都是基于 Eclipse + ADT 的,所以了解这种开发方式对于初学者是很必要的,便于更快的入门和转入 Android Studio的使用。(当然,有自信和自学能力强的人可以直接使用 Android Studio)

Eclipse + ADT 开发环境的搭建
Eclipse 是一个免费的、开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境,通过安装插件,可以用它开发 C/C++,Java,Python,Perl,Ruby,Android,PHP等。

Eclipse 的官方下载地址:http://www.eclipse.org/downloads/,其他下载站点百度一下即可。

Eclipse是免安装的,下载下来的一般是个压缩包,但是有Windows,Linux,Mac操作系统和32bit和64bit之分,根据自己的电脑选择对应的下载即可。

我们都知道,原生 App 是基于 Java 开发的,因此,在开发 Java 程序之前,必须先完成一些准备工作,也就是在计算机上安装并配置 Java 开发环境,即安装和配置 JDK。

JDK 的全称是 Java SE Development Kit,即Java 标准版开发包,是 Sun 公司提供的一套用于开发 Java 应用程序的开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括 Java编译器、Java运行时环境,以及常用的Java类库。
官方下载 JDK 的地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,类似于Eclipse,需要根据自己电脑的操作系统和位数选择对应的 JDK。

%title插图%num

安装时需要选择 JDK 的安装路径,系统默认会安装在 C:\Program Files\Java 路径下,但是不推荐安装在有空格的路径下,这样可能导致一些未知的问题,建议直接安装在根路径下,例如 D:\Java\jdk1.8.0_112\。安装完成后,我们还要配置一下环境变量,此处只说明Windows操作系统下的配置过程:
点击左下角win窗口图标,右键点击计算机,或者直接右键桌面上的“计算机”图标,点击“属性”,进入了“控制面板\系统和安全\系统”窗口,单击该窗口左边栏的“高级系统设置”。

%title插图%num
在“高级”Tab页里,单击“环境变量”按钮,进入环境变量对话框。

%title插图%num
在下方的系统变量中,新建 变量名:JAVA_HOME,变量值:JDK安装路径,就是之前下载 JDK 后的安装路径,比如 D:\Java\jdk1.8.0_112。

%title插图%num
找到变量 Path,点击编辑,在*后添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;注意里面的每项都是用英文的分号;来隔开的,这个电脑已经有了,只是编辑,添加,不是新建。然后新建 变量名:CLASSPATH,变量值为 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;。(注意*前面有个.;)

%title插图%num
这样 JDK 的环境变量就配置完成,打开Windows操作系统的命令行窗口(在“开始”菜单里运行cmd命令即可),在命令行中分别输入 java 和 javac 命令,如果得到的是 java 或 javac 的用法帮助信息,那么说明我们的环境变量配置成功了。
%title插图%num

完成以上步骤,我们就可以开发J2SE的程序了,但是这里我们是要开发 Android App,所以我们还要安装 Android 在 Eclipse 上的插件 ADT ,它的全称是 Android Developer Tools Plug-in。现在,谷歌的官网上已经没有 ADT 的下载链接了,它会提示你用 Android Studio ,并将之前的项目迁移到 Android Studio 上,因此推荐大家采用离线安装的方式。
这里贴出一个国内的下载链接,里面提供了Android开发的所有工具下载。http://tools.android-studio.org/index.php。Eclipse离线安装 ADT 插件的方法可以参考如下百度经验:ADT离线安装教程。

Android SDK 的下载配置
SDK:(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。因此,Android SDK 指的是Android专属的软件开发工具包。
它的官方下载地址是:https://developer.android.com/studio/index.html。但是,由于国内GFW的原因,外国的网站基本访问不了,我们只能在国内其他网站下载,这些资源还是非常容易找到的(由于在线下载的不稳定和不确定性,这里只说明离线下载配置的方法)。上面的链接已经有SDK的下载地址了,这里再贴两个另外的链接:http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform-sdk-download-mirror.html,http://www.androiddevtools.cn/。每个版本都有两种类型的SDK,分别是exe和zip格式的(这里指Windows操作系统),即可执行安装程序的和免安装压缩包。SDK的安装或解压路径*好也是根路径,反正不要带有中文(安装国外的软件都要注意这点,这是个好的习惯,虽然不一定是强制性的)。
这里需要注意的是,无论通过哪种方式,下载的SDK都只是个工具而已,打开SDK的文件夹,里面的内容大致是这样的。(可能有细微区别)
%title插图%num
这里可以看到一个可执行程序SDK Manager,顾名思义,它就是 SDK 的管理工具,双击它,会出现如下窗口。
%title插图%num
Android操作系统的所有版本都在这里,需要哪个就下载哪个,然后点击右下角的install * packages,出现下面的窗口,点击要下载的package,选择accept,*后选择install即可安装。
%title插图%num

这里值得一提的是,这种下载速度基本是龟速(如果不*的话),所以,强烈建议大家学会科学上网,哪怕花钱也好,试想,一个Android开发人员连Android官网都上不去的话,那是多么可怕的一件事!
这里,贴上一篇解决这个问题的文章(我没有试过,我一直在墙外),http://blog.csdn.net/freedom2028/article/details/6261810。
安装完成之后,为了在命令行窗口可以使用 Android SDK 的各种工具,建议将 Android SDK 目录下的 tools 子目录、 platform-tools 子目录添加到系统的PATH环境变量中。
*后,值得一提的是,如果你觉得上面的步骤太复杂,你也可以下载多合一下载包ADT Bundle,里面包含了:sdk + 特定版本platform + eclipse + adt + 兼容包,解压缩即可使用。

*个Hello World项目
双击打开Eclipse,出现如下的窗口,即指定工作空间的路径。自己建个文件夹即可或者使用默认设置。
%title插图%num
打开后,点击File->New->Android Application Project,出现如下窗口。项目名称可以写为 HelloWorld,SDK根据自己下载的,选择要用的即可,theme选择none即可,然后一直点击next,直至finish即可,这样一个helloworld项目就建成了。
%title插图%num

Android虚拟设备神器Genymotion
Android应用程序可以在虚拟机和真机上运行,真机测试很容易,Android手机通过USB线接上电脑,打开USB调试,在Eclipse里右键点击项目HelloWorld->Run as->Android Application,在设备选项里选择你的手机即可。
这里主要说明 AVD(Android Virtual Device)的使用,以上环境都完成了,你会看到Eclipse的工具栏里会有一个Android的图标,Android Virtual Device Manager在SDK Manager的旁边。
%title插图%num
在这里,可以创建和管理Android 虚拟机,但是不用不知道,一用吓一跳,这里创建的Android 虚拟机启动慢的令人发指,少则十几分钟,多则无法估计(因为无法再等下去,直接停掉了),刚开始的时候我们会以为是自己电脑出了问题,其实不然,它本来就这么慢。
还好,我们有另一款使用非常容易也非常快的虚拟机Genymotion(一般启动在10s左右吧),它的官网是https://www.genymotion.com/,中文官网是http://www.genymotion.net/,它的使用教程可以参考百度经验http://jingyan.baidu.com/article/3ea51489e7d8bd52e61bba36.html。这里特别提醒一点,genymotion是基于Virtual box 运行的,如果安装之后,可以正常运行,就不要再更新了,它的更新提示直接忽略即可,不然可能导致无法使用了。
Eclipse还有个genymotion的插件,安装后可以在Eclipse中生成一个按钮,点击即可启动genymotion,上面图片上有,在SDK manager的左边(右边是AVD manager),因为可以先运行genymotion,之后运行Android程序,所以这里忽略。

运行HelloWorld
好了,所有工作都做完了,现在运行HelloWorld项目吧。
%title插图%num

到这里,我们的HelloWorld也运行出来了,可能你也发现了,我们一句代码也没有写,没错,按照以上步骤,默认建立出来的就是这样一个HelloWorld项目,它显示的内容就是Hello world!

Android Studio
前面也说到了,Android Studio是Google官方推出的IDE,官网上这么说的“Android Studio 提供用于为各类 Android 设备构建应用的*快速的工具,利用世界一流的代码编辑、调试、性能工具、一套灵活的构建系统以及一套即时构建/部署系统,您可以专注于构建独特的高品质应用。”总之,Android Studio是非常强,也非常大的Android开发利器,学习它需要一定的时间,另外,运行AS对电脑的配置要求比较高,官方推荐win7以上操作系统,8GB RAM,*低屏幕分辨率:1280 x 800,这意味着一般的电脑根本跑不动。(那些非常强大的IDE一般都很大,运行条件都很苛刻,其实也可以理解)。
AS的官方下载地址是https://developer.android.com/studio/index.html,其他的下载地址有:http://tools.android-studio.org/index.php,http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform-sdk-download-mirror.html,http://tools.android-studio.org/index.php/sdk/等,百度一下,你就知道。
AS的使用教程如下:http://www.open-open.com/lib/view/open1433387390635.html。
AS的视频教程如下:http://www.jikexueyuan.com/course/2531_1.html?ss=1。

2、Web App
什么是Web App?维基百科的解释是这样的:In computing, a web application or web app is a client–server software application in which the client (or user interface) runs in a web browser. Common web applications include webmail, online retail sales, online auctions, wikis, instant messaging services and many other functions.理解一下是这样的:Web App就是运行于网络和标准浏览器上,基于网页技术开发实现特定功能的应用,可以理解为一个触屏版的网站。不同于原生App,Web App 不是基于操作系统运行的,而是运行在浏览器里的,它的宿主是浏览器,它所需的资源一般都在网络上,因此,它不需要下载安装,但是使用它必须要联网。这类应用我们常用的有百度新闻,163邮箱,淘宝触屏版等。
因此,Web App 就是网页的开发,主要利用前端知识,诸如HTML5,CSS,JavaScript等。
知乎上推荐的一些较好的 Web App: https://www.zhihu.com/question/19727553。

3、Hybrid App
那么什么是 Hybrid App 呢?从字面意思理解就是混合的应用。没错,它就是前面两者的混合应用。
Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
这三者涵盖了市场上所有的移动应用。它们的比较如下:
%title插图%num
网络上有很多关于这三者的分析理解,摘录如下:
https://www.zhihu.com/question/23622875
http://www.uisdc.com/web-hybrid-native-app
http://baike.baidu.com/link?url=FANt8_qieZwhFjBxYrZd03alBIOhqqK41XhyScMS4aDKISIx5-ZN0GYR9wfDiLTjwWfBaJeoWKnRV7zcKmBhnjiyyCyKpy_b4KYEAJKhaeG
http://www.zhongkerd.com/news/content-1198.html
这里是开源中国社区整理的非常全面的121款手机Web开发框架:
http://www.oschina.net/project/tag/322/mobile-web?lang=0&os=0&sort=view&p=1

4、有趣的 App Inventor
App Inventor的设计目的就是为了让毫无编程经验的人(比如儿童)可以开发有趣的手机应用。App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和勇于挑战的Google使用者共同参与设计完成。
由于GFW的原因,国内访问不了App Inventor的官网,无法在线编程(之前国内还有站点可以访问,但是现在未找到),它的官网是:http://appinventor.mit.edu/explore/。值得庆幸的是,App Inventor提供离线开发的方式,它的离线安装包可以在这里下载(这是我的百度网盘,失效请告知我):http://pan.baidu.com/s/1sldCqoX。
AI2离线包的安装使用说明可以参考:http://www.arduino.cn/thread-12392-1-1.html。安装完成后,使用时打开离线环境,在浏览器中输入127.0.0.1:8888(localhost:8888)就回进入登录页面,如下图
%title插图%num

输入自己的账号,进入开发页面,如下图

%title插图%num

这样就可以开发自己的应用了。

文件处理与pdf处理

文件处理与pdf处理

文章目录
一、文件处理与pdf处理思维导图
二、补充说明:pdf的读取、合并、转换、水印添加(自学,如有错误烦请指正)
1、pdf的读取
1. 对pdf文本内容的读取
2、读取pdf表格内容转化为EXCEL
2、pdf的合并
3、word转pdf(没仔细看)
4、pdf添加水印
一、文件处理与pdf处理思维导图

%title插图%num
二、补充说明:pdf的读取、合并、转换、水印添加(自学,如有错误烦请指正)
1、pdf的读取
1. 对pdf文本内容的读取
主要使用的是pdfplumber库

%title插图%num

库的安装:(以 anaconda为例)

%title插图%num
如果出现error,建议根据出错的类型百度,我出错的原因是pip太旧了啥啥的,更新就好了
安装完成后,请看代码及注释
import pdfplumber #导入库
with pdfplumber.open(“D:/ps/test.pdf”) as pdf :
pdf_len = len(pdf.pages) #获取pdf所有页数
print(pdf_len) #输出pdf所有页数
first_page = pdf.pages[0] #获取pdf页面信息列表的*页的内容
print(first_page) #输出
print(first_page.chars[0]) #输出*页的独立的字符的属性
first_page.extract_text() #获取当前页面文本值
for i in range(0,pdf_len): # 遍历所有页面,获取文本值并输出
print(pdf.pages[i].extract_text())

2、读取pdf表格内容转化为EXCEL
部分代码:

import pdfplumber #导入库
import pandas as pd #导入库
import os #导入库

old_dir_path = ‘D:/tools/python/study/datafile/txtpdf/oldfiles’ #路径
old_pdf_path = os.path.join(old_dir_path,’first.pdf’) #旧处理文件的地址

pdf = pdfplumber.open(old_pdf_path) #打开旧的需要进行处理的文件,命名为pdf

pdf_pages = len(pdf.pages) #获取pdf的页数
pdf_pages

#获取*页的表格,若没有表格,会返回错误
pdf.pages[1].extract_table()

all_content = [] #创建一个列表,获取pdf的所有表格

for i in range(0,pdf_pages): #0到*后一页循环
for j in pdf.pages[i].extract_tables(): #返回[[每一行内容]]的嵌套格式的内容,没有表格,返回空字符串的列表
for k in j: #对每一行内容进行遍历
if ‘ ‘ not in k: #判断是否有空字符串
all_content.append(k) #在建立原列表的基础上添加内容
print(k) #输出

data = pd.DataFrame(all_content) #转成DataFrame(),二维的有行有列的表
print(data)
data.to_excel(‘pdf_tables.xlsx’,index = False, header = None) #生成xlsx文件,即excel里面的表格

2、pdf的合并
代码(非完全自创代码段):

from PyPDF2 import PdfFileReader #导入库
from PyPDF2 import PdfFileWriter
import os

old_dir_path = ‘D:/tools/python/study/datafile/txtpdf/oldfiles’ #写入路径

pdf_paths = [] #定义一个列表保存所有pdf路径

for file_name in os.listdir(old_dir_path): #使用os模块,获得该路径下所有文件
if ‘.pdf’ in file_name: #判断是否是pdf文件,是的话则加入列表
pdf_paths.append(os.path.join(old_dir_path,file_name)) # 增加了路径
new_pdf = PdfFileWriter() # 类 支持将pdf文件写出,给定由另一类产生的页面(通常为 PdfFileReader)
#记录 pdf总页数
numPages = 0
for pdfpath in pdf_paths: #循环获取路径
old_pdf = PdfFileReader(open(pdfpath,’rb’)) #初始化
pdfPages = old_pdf.getNumPages()#获取当前pdf页数
numPages += pdfPages #增加pdf页数
for i in range(old_pdf.getNumPages()) : #增加所有页面合并后的内容
new_pdf.addPage(old_pdf.getPage(i))
with open(os.path.join(new_pdf_path,new_name),’wb’) as p:
new_pdf.write(p) #写入pdf

3、word转pdf(没仔细看)
4、pdf添加水印
pdf添加水印,其实我认为就是pdf和水印的pdf进行合并而产生的效果,所以代码也是从这个思路走的
代码段+注释:

from PyPDF2 import PdfFileReader,PdfFileWriter #导入库
pdf = PdfFileReader(‘D:/tools/python/study/datafile/txtpdf/oldfiles/first.pdf’)
water_pdf = PdfFileReader(‘D:/tools/python/study/datafile/txtpdf/water.pdf’)

water = water_pdf.getPage(0)
writer = PdfFileWriter()

for i in range(pdf.getNumPages()):
pdf.getPage(i).mergePage(water)
writer.addPage(pdf.getPage(i))

writer.write(open(‘newnew.pdf’,’rwb’))

python还可以对pdf进行很多操作,这里只是列举了常见得几种,对于有密码得pdf,我选择手动解个密(狗头),文件批量处理就当我没说,作为初学者,还有很多地方不是太懂,希望后续可以更新改进。

 

pywin32介绍到入门

pywin32介绍到入门

pywin32介绍
1. pywin32从驱动层模拟键盘鼠标的输入!
2. 注意 pip install pywin32安装之后 是这样的三个包:
3. pywin32的搜索关键词
1. pywin32从驱动层模拟键盘鼠标的输入!
比如我们打算写一个 某银行网银登陆 的爬虫,因为该银行网站的ActiveX控件的限制,只能在win环境下使用ie浏览器,简单测试代码如下

# 这是错误示例
from selenium import webdriver

class Loginer(object):

def __init__(self, username):
self.username = username
iedriver = ‘.\IEDriverServer.exe’ # iedriver路径
self.driver = webdriver.Ie(iedriver)
self.driver.delete_all_cookies()
self.driver.get(‘https://perbank.abchina.com/EbankSite/startup.do’)

def input_name(self):
input(‘准备输入用户名!’)
self.driver.find_element_by_id(‘username’).send_keys(self.username)

if __name__ == ‘__main__’:
username = ‘testlogin’
login = Loginer(username)
login.input_name()

现象:各种报错!无论是否加载控件都不能输入账号! 短时间又搞不定activeX加密控件!网站有高级反爬,这就是那剩下5%的网站其中之一!此时我们怎么办呢?

看这个文件!input_key.py我们可以从驱动层模拟鼠标键盘的动作!

注意:

1.需要手动调整ie浏览器的位置或调整代码中的坐标参数
2.被selenium控制的ie浏览器必须调整为100%大小比例
1
2
import win32api
import win32con
import win32gui
from ctypes import *
import time

VK_CODE = {
‘backspace’:0x08,
‘tab’:0x09,
‘clear’:0x0C,
‘enter’:0x0D,
‘shift’:0x10,
‘ctrl’:0x11,
‘alt’:0x12,
‘pause’:0x13,
‘caps_lock’:0x14,
‘esc’:0x1B,
‘spacebar’:0x20,
‘page_up’:0x21,
‘page_down’:0x22,
‘end’:0x23,
‘home’:0x24,
‘left_arrow’:0x25,
‘up_arrow’:0x26,
‘right_arrow’:0x27,
‘down_arrow’:0x28,
‘select’:0x29,
‘print’:0x2A,
‘execute’:0x2B,
‘print_screen’:0x2C,
‘ins’:0x2D,
‘del’:0x2E,
‘help’:0x2F,
‘0’:0x30,
‘1’:0x31,
‘2’:0x32,
‘3’:0x33,
‘4’:0x34,
‘5’:0x35,
‘6’:0x36,
‘7’:0x37,
‘8’:0x38,
‘9’:0x39,
‘a’:0x41,
‘b’:0x42,
‘c’:0x43,
‘d’:0x44,
‘e’:0x45,
‘f’:0x46,
‘g’:0x47,
‘h’:0x48,
‘i’:0x49,
‘j’:0x4A,
‘k’:0x4B,
‘l’:0x4C,
‘m’:0x4D,
‘n’:0x4E,
‘o’:0x4F,
‘p’:0x50,
‘q’:0x51,
‘r’:0x52,
‘s’:0x53,
‘t’:0x54,
‘u’:0x55,
‘v’:0x56,
‘w’:0x57,
‘x’:0x58,
‘y’:0x59,
‘z’:0x5A,
‘numpad_0’:0x60,
‘numpad_1’:0x61,
‘numpad_2’:0x62,
‘numpad_3’:0x63,
‘numpad_4’:0x64,
‘numpad_5’:0x65,
‘numpad_6’:0x66,
‘numpad_7’:0x67,
‘numpad_8’:0x68,
‘numpad_9’:0x69,
‘multiply_key’:0x6A,
‘add_key’:0x6B,
‘separator_key’:0x6C,
‘subtract_key’:0x6D,
‘decimal_key’:0x6E,
‘divide_key’:0x6F,
‘F1’:0x70,
‘F2’:0x71,
‘F3’:0x72,
‘F4’:0x73,
‘F5’:0x74,
‘F6’:0x75,
‘F7’:0x76,
‘F8’:0x77,
‘F9’:0x78,
‘F10’:0x79,
‘F11’:0x7A,
‘F12’:0x7B,
‘F13’:0x7C,
‘F14’:0x7D,
‘F15’:0x7E,
‘F16’:0x7F,
‘F17’:0x80,
‘F18’:0x81,
‘F19’:0x82,
‘F20’:0x83,
‘F21’:0x84,
‘F22’:0x85,
‘F23’:0x86,
‘F24’:0x87,
‘num_lock’:0x90,
‘scroll_lock’:0x91,
‘left_shift’:0xA0,
‘right_shift ‘:0xA1,
‘left_control’:0xA2,
‘right_control’:0xA3,
‘left_menu’:0xA4,
‘right_menu’:0xA5,
‘browser_back’:0xA6,
‘browser_forward’:0xA7,
‘browser_refresh’:0xA8,
‘browser_stop’:0xA9,
‘browser_search’:0xAA,
‘browser_favorites’:0xAB,
‘browser_start_and_home’:0xAC,
‘volume_mute’:0xAD,
‘volume_Down’:0xAE,
‘volume_up’:0xAF,
‘next_track’:0xB0,
‘previous_track’:0xB1,
‘stop_media’:0xB2,
‘play/pause_media’:0xB3,
‘start_mail’:0xB4,
‘select_media’:0xB5,
‘start_application_1’:0xB6,
‘start_application_2’:0xB7,
‘attn_key’:0xF6,
‘crsel_key’:0xF7,
‘exsel_key’:0xF8,
‘play_key’:0xFA,
‘zoom_key’:0xFB,
‘clear_key’:0xFE,
‘+’:0xBB,
‘,’:0xBC,
‘-‘:0xBD,
‘.’:0xBE,
‘/’:0xBF,
“`”:0xC0,
‘;’:0xBA,
‘[‘:0xDB,
‘\\’:0xDC,
‘]’:0xDD,
“‘”:0xDE,
‘`’:0xC0}

class POINT(Structure):
_fields_ = [(“x”, c_ulong),(“y”, c_ulong)]

def get_mouse_point():
po = POINT()
windll.user32.GetCursorPos(byref(po))
return int(po.x), int(po.y)

def mouse_click(x=None,y=None):
if not x is None and not y is None:
mouse_move(x,y)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

def mouse_dclick(x=None,y=None):
if not x is None and not y is None:
mouse_move(x,y)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)

def mouse_move(x,y):
windll.user32.SetCursorPos(x, y)

def key_input(str=”):
for c in str:
win32api.keybd_event(VK_CODE[c],0,0,0)
win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0)
time.sleep(0.01)

def t0():
pass

def t2():
mouse_click(800,200)
for c in ‘hello’:
win32api.keybd_event(65,0,0,0) #a键位码是86
win32api.keybd_event(65,0,win32con.KEYEVENTF_KEYUP,0)
#print get_mouse_point()

def t1():
#mouse_move(1024,470)aa
#time.sleep(0.05)
#mouse_dclick()HELLO
mouse_dclick(1024,470)

def t3():
mouse_click(1024,470)
str = ‘hello’
for c in str:
win32api.keybd_event(VK_CODE[c],0,0,0) #a键位码是86
win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0)
time.sleep(0.01)

def t4(str, x, y):
mouse_click(x, y)
key_input(str)

if __name__ == “__main__”:

# 100 350是坐标参数,需要调整!
t4(‘aaa’, 100, 350) # 在这里进行测试输出位置!

打开ie浏览器某网银登陆界面,只要不断的调试函数中的X,Y坐标和IE浏览器的位置就可以进行模拟输入进而登陆!

2. 注意 pip install pywin32安装之后 是这样的三个包:
import win32api
import win32con
import win32gui

3. pywin32的搜索关键词
上边的那个只是初步的解决方案!更完美的解决方法我们需要了解几个关键词!

句柄
外挂
后台

可以通过pywein32包拿到ie浏览器的句柄,就可以随时获取ie的坐标,这样就不怕浏览器的位置发生改变了,也就不需要调整ie浏览器的位置,更不需要调整xy坐标参数了! 并且我们可以用pywin32包控制鼠标键盘的动作为后台运行,这样就不影响鼠标键盘的正常使用了

18条很棒的python一行代码

18条很棒的python一行代码

 

1交换两个变量
以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素。

a = 4
b = 5
a,b = b,a
print(a,b)
# 5,4

2 多个变量赋值
a,b,c = 4,5.5,’Hello’
print(a,b,c)
# 4,5.5,hello

你可以使用逗号和变量一次性将多个值分配给变量。使用此技术,你可以一次分配多个数据类型。
你可以使用列表将值分配给变量。下面是将列表中的多个值分配给变量的示例。

a,b,*c = [1,2,3,4,5]
print(a,b,c)
# 1 2 [3,4,5]

3列表中偶数的和
有很多方法可以做到这一点,但*好和*简单的方法是使用列表索引和sum函数。

a = [1,2,3,4,5,6]
s = sum([num for num in a if num%2 == 0])
print(s)
# 12

4 通过函数取差
你可以在一行代码内调用多个函数。
如下方法首先会应用一个给定的函数,然后再返回应用函数后结果有差别的列表元素。

def difference_by(a, b, fn):
b = set(map(fn, b))
return [item for item in a if fn(item) not in b]
from math import floor
difference_by([2.1, 1.2], [2.3, 3.4],floor) # [1.2]
difference_by([{ ‘x’: 2 }, { ‘x’: 1 }], [{ ‘x’: 1 }], lambda v : v[‘x’])
# [ { x: 2 } ]

5 链式函数调用
你可以在一行代码内调用多个函数。

def add(a, b):
return a + b
def subtract(a, b):
return a – b
a, b = 4, 5
print((subtract if a > b else add)(a, b))
# 9

6 检查重复项
如下代码将检查两个列表是不是有重复项。

def has_duplicates(lst):
return len(lst) != len(set(lst))
x = [1,2,3,4,5,5]
y = [1,2,3,4,5]
has_duplicates(x) # True
has_duplicates(y) # False

7 合并两个字典
下面的方法将用于合并两个字典。

def merge_two_dicts(a, b):
c = a.copy() # make a copy of a
c.update(b) # modify keys and values of a with the once from b
return c
a={‘x’:1,’y’:2}
b={‘y’:3,’z’:4}
print(merge_two_dicts(a,b))
#{‘y’:3,’x’:1,’z’:4}

在 Python 3.5 或更高版本中,我们也可以用以下方式合并字典:

def merge_dictionaries(a, b)
return {**a, **b}
a = { ‘x’: 1, ‘y’: 2}
b = { ‘y’: 3, ‘z’: 4}
print(merge_dictionaries(a, b))
# {‘y’: 3, ‘x’: 1, ‘z’: 4}

8 将两个列表转化为字典
如下方法将会把两个列表转化为单个字典。

def to_dictionary(keys, values):
return dict(zip(keys, values))
keys = [“a”, “b”, “c”]
values = [2, 3, 4]
print(to_dictionary(keys, values))
#{‘a’: 2, ‘c’: 4, ‘b’: 3}

9 使用枚举
我们常用 For 循环来遍历某个列表,同样我们也能枚举列表的索引与值。

list = [“a”, “b”, “c”, “d”]
for index, element in enumerate(list):
print(“Value”, element, “Index “, index, )
# (‘Value’, ‘a’, ‘Index ‘, 0)
# (‘Value’, ‘b’, ‘Index ‘, 1)
#(‘Value’, ‘c’, ‘Index ‘, 2)
# (‘Value’, ‘d’, ‘Index ‘, 3)

10 执行时间
如下代码块可以用来计算执行特定代码所花费的时间。

import time
start_time = time.time()
a = 1
b = 2
c = a + b
print(c) #3
end_time = time.time()
total_time = end_time – start_time
print(“Time: “, total_time)
# (‘Time: ‘, 1.1205673217773438e-05)

11 Try else
我们在使用 try/except 语句的时候也可以加一个 else 子句,如果没有触发错误的话,这个子句就会被运行。

try:
2*3
except TypeError:
print(“An exception was raised”)
else:
print(“Thank God, no exceptions were raised.”)
#Thank God, no exceptions were raised.

12 元素频率
下面的方法会根据元素频率取列表中*常见的元素。

def most_frequent(list):
return max(set(list), key = list.count)
list = [1,2,1,2,3,2,1,4,2]
most_frequent(list)

13 回文序列
以下方法会检查给定的字符串是不是回文序列,它首先会把所有字母转化为小写,并移除非英文字母符号。*后,它会对比字符串与反向字符串是否相等,相等则表示为回文序列。

def palindrome(string):
from re import sub
s = sub(‘[\W_]’, ”, string.lower())
return s == s[::-1]
palindrome(‘taco cat’) # True

14 不使用 if-else 的计算子
这一段代码可以不使用条件语句就实现加减乘除、求幂操作,它通过字典这一数据结构实现:

import operator
action = {
“+”: operator.add,
“-“: operator.sub,
“/”: operator.truediv,
“*”: operator.mul,
“**”: pow
}
print(action[‘-‘](50, 25)) # 25

15 Shuffle
该算法会打乱列表元素的顺序,它主要会通过 Fisher-Yates 算法对新列表进行排序:

from copy import deepcopy
from random import randint
def shuffle(lst):
temp_lst = deepcopy(lst)
m = len(temp_lst)
while (m):
m -= 1
i = randint(0, m)
temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
return temp_lst
foo = [1,2,3]
shuffle(foo)
# [2,3,1] , foo = [1,2,3]

16 展开列表
将列表内的所有元素,包括子列表,都展开成一个列表。

def spread(arg):
ret = []
for i in arg:if isinstance(i, list):
ret.extend(i)
else:
ret.append(i)
return ret
spread([1,2,3,[4,5,6],[7],8,9])
# [1,2,3,4,5,6,7,8,9]

17 交换值

不需要额外的操作就能交换两个变量的值。

def swap(a, b):
return b, a
a, b = -1, 14
swap(a, b)
# (14, -1)
spread([1,2,3,[4,5,6],[7],8,9])
# [1,2,3,4,5,6,7,8,9]

18 字典默认值
通过 Key 取对应的 Value 值,可以通过以下方式设置默认值。如果 get() 方法没有设置默认值,那么如果遇到不存在的 Key,则会返回 None。

d = {‘a’: 1, ‘b’: 2}
print(d.get(‘c’, 3)) # 3