pyautogui图形界面自动化

前情请翻历史记录找这之前的两篇:‘卡住了’和‘中文字符变量拷到剪切板后粘贴出来’。

剧情发展到我以为找到了方向,美滋滋滴拿出来晒。

 

当时以为用以下代码可以把中文送到剪切板,然后再原封不动滴粘贴出来:

from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('两两相忘')
r.update() 
r.destroy()

万万没想到这是个大坑,一脚踩下去‘轰’滴就倒栽葱到坑底。

 

逼得我到stackoverflow上去问:TK的剪切板和系统剪切板是不是不同步啊?

 

这个问题还没解决,又发现把代码放到搭好框架的自动填表程序后,每次运行到控制粘贴组合键试图把中文填入时,窗口都会“冻住”,这种自动控制最怕节奏不一致,这边一错后面跟着全乱套.......

 

“左冲右杀”好几天后决定放弃这个解决思路。

 

决定退回到subprocess的解法,认真研究

proc1 = subprocess.Popen(['echo', '陆小凤'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['pbcopy'], stdin=proc1.stdout) 

这两条代码的前世今生(我用的是mac)。

 

1、捏着鼻子&耐着性子对照subprocess技术文档查着看,觉得应该先看

p1=subprocess.Popen(['echo','午夜星河‘], stdout=subprocess.PIPE

的subprocess.PIPE管道里的东西长什么样。

2、通过print(p1.communicate()[0])查看,发现是一堆看不懂的代码

3、通过print(chardet.detect(output1)) (需要引入chardet模块),得知代码是utf-8编码

4、print('午夜星河'.encode('utf-8'))出来的代码跟上面那堆看不懂的代码一摸一样,更确信subprocess.PIPE管道里是‘午夜星河’的utf-8编码

5、这些编码如果utf-8解码的话应该输出‘午夜星河’本身啊!print(output1.decode('utf-8'))可以验证这一点

6、所以问题出在解码这一步。p2=subprocess.Popen(['pbcopy'],stdin=p1.stdout),进来的是‘午夜星河’的utf-8编码,通过pbcopy命令存入到剪切板,但解码输出时乱码,说明解码没有用utf-8解码

 

搜索引擎上开始搜pbcopy的encoding和decoding, 数次尝试之后找到症结所在(https://stackoverflow.com/questions/7165108/in-os-x-lion-lang-is-not-set-to-utf-8-how-to-fix-it):

在terminal敲入命令:locale,我的输出类似于:

LANG=

LC_COLLATE="C"

LC_CTYPE="C"

LC_MESSAGES="C"

LC_MONETARY="C"

LC_NUMERIC="C"

LC_TIME="C"

LC_ALL=

 

不清楚哪一个影响IOEncoding的编码,但是可以全排山倒海排成UTF-8编码,‘宁可错杀一千,也不错过一个’,

 

反正现在UTF-8几乎一统江湖啦。

 

打开finder去用户的根目录下找文件.bash_profile,什么?找不到,没看到文件名前面有个点么?!那就是为了让你看不见的(隐藏文件属性)。照妖镜(快捷键command+shift+.)一照,管叫那隐藏文件无处遁形。

 

打开在文件末尾加入(最好给个注释,你看别的命令前都有注释解释下,好东西咱得跟着学):

export LC_ALL=en_US.UTF-8  

export LANG=en_US.UTF-8

再回敲locale,输出变成:

LC_COLLATE="en_US.UTF-8"

LC_CTYPE="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_ALL="en_US.UTF-8"

再回头试:

proc1 = subprocess.Popen(['echo', '云开见月'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['pbcopy'], stdin=proc1.stdout) 

漂亮的中文字映入眼帘,“春天里来百花香郎里格朗里格朗里格朗,和暖的太阳在天空照照到了我的破衣裳”

 

又经过了一些调试测试,终于可以吧这段代码引入到自动填写表格的代码中了,非常流畅的完成自动把中文填入文本框的任务。

 

在录制视频时,突发奇想,想试试最初被果断抛弃的两个办法:

import pyperclip

pyperclip.copy('浮世繁华')

然后粘贴,‘浮世繁华’四个字跃然屏上

 

import clipboard

clipboard.copy('天龙八部')

‘天龙八部’四个字也完美呈现

 

心情复杂,绕了一大圈回到原点,原来以为是这个不支持那个不支持,原来问题一直在自己的编码环境设置上啊。

 

果断在自动填写表格的代码中,用

Import pyperclip

pyperclip.copy('浮世繁华')

替换到之前的subprocess解决方案。

啥也不说了,我先哭一会儿去~~~