python功能笔记——杂七杂八

发布时间:2019-06-30 16:51:51编辑:auto阅读(1966)

    ×××复习阶段,无聊弄点东西玩一下,实现功能有(控制浏览器访问学校校历,截图保存下来,通过图片处理,最终将其设置为桌面):

        1.控制浏览器访问网页;

        2.将网页截图;

        3.图片处理(图片合并、图片换色);

        4.调用win32Api,将图片设置为壁纸;

        5.py脚本转exe可执行程序;

        6.获取鼠标所在位置的xy值和RGB值。

     所编写内容均来自互联网,下面进行记录(完整的代码放到http://188.131.140.135/softwareList/Mine/):


    一、获取网页截图与环境配置(所有安装的包如图所示)

        下面不再赘述包的安装,如果报错,可以使用pip安装对应的包

    TIM截图20180913144947.png

        可以到http://188.131.140.135/softwareList/ 下载不好找的包和ChromeDriver(用于控制谷歌浏览器的驱动)(对应的是Chrome最新的版本)

            ChromeDriver不需要安装,只要放到谷歌浏览器的安装目录下即可,默认是:C:\Program Files (x86)\Google\Chrome\Application下

                然后修改一下系统变量,如下图所示:

    TIM截图20180913151052.png

    TIM截图20180913151008.png

            接下来就可以通过selenium获取网页的截图了,参考代码如下(来自于互联网):

    from selenium import webdriver
    from PIL import Image
    import os
    #引入chromedriver.exe
    option = webdriver.ChromeOptions()#引入参数
    #option.add_argument('headless')#屏蔽浏览器显示,效果是不打开浏览器就实现功能,但是为了截图,还是要打开比较好
    chromedriver = "chromedriver.exe"
    os.environ["webdriver.chrome.driver"] = chromedriver
    browser = webdriver.Chrome(chromedriver,chrome_options=option)
    #设置浏览器需要打开的url
    url = "http://202.206.243.9/xiaoli.asp"  
    browser.maximize_window()#将浏览器窗口最大化
    browser.get(url)
    browser.execute_script("""
      (function () {
        var y = 50;
        var step = 100;
        window.scroll(0, 0);
         function f() {
          if (y < document.body.scrollHeight) {
            y += step;
            window.scroll(0, y);
            setTimeout(f, 50);
          } else {
            window.scroll(0, 0);
            document.title += "scroll-done";
          }
        }
        setTimeout(f, 1000);
      })();
    """)#执行截图脚本
    for i in range(30):
      if "scroll-done" in browser.title:
        break
        time.sleep(1)
    browser.save_screenshot("schoolCalenderSource.png")#将截图保存
    browser.close()#关闭浏览器
    browser.quit()#关闭Chrome Driver

        如果一切顺利的话,就可以在当前目录下得到一张名为schoolCalenderSource.png的截图了,如下图所示:

    schoolCalenderSource.png

    二、对获取到的截图进行处理

        上面获取到的这个图片并不能直接用来做桌面,所以需要进行裁剪,将中间显示日历的部分裁剪出来,使用到的包是上边已经导过的PIL(通过安装Pillow),代码如下:

    im = Image.open("schoolCalenderSource.png")
    # 图片的宽度和高度
    img_size = im.size
    x = 400
    y = 260
    w = 1100
    h = 570
    region = im.crop((x, y, x+w, y+h))  #在这里可以多试几次,以裁出一个最合适的大小
    region.save("./schoolCalenderBeCut.png")

            裁取后将图片保存为schoolCalenderBeCut.png,如下图所示:

    schoolCalenderBeCut.png

        在截取之后,可以直接将其设置为桌面背景,但是不太好看,所以可以通过win10自带的绘图软件自己绘制一个背景图片,将其命名为base.png,如下图所示(随便画):

    base.png

        制作好了背景图之后,就可以将两张图片进行拼合,过程是将截图缩小,然后粘贴到背景图上,代码如下所示:

    #加载底图
    base_img = Image.open('base.png')
    base_img = base_img.resize((1920,1600))
    # 可以查看图片的size和mode,常见mode有RGB和RGBA,RGBA比RGB多了Alpha透明度
    # print base_img.size, base_img.mode
    box = (500, 600, 1600, 1170)  # 底图上需要P掉的区域,这些数字通过自己来多次尝试,才能试出一个合适的数字
    #1100 570  
    #加载需要P上去的图片
    tmp_img = Image.open('schoolCalenderBeCut.png')
    #这里可以选择一块区域或者整张图片
    #region = tmp_img.crop((0,0,304,546)) #选择一块区域
    #或者使用整张图片
    region = tmp_img
    #使用 paste(region, box) 方法将图片粘贴到另一种图片上去.
    # 注意,region的大小必须和box的大小完全匹配。但是两张图片的mode可以不同,合并的时候回自动转化。如果需要保留透明度,则使用RGMA mode
    #提前将图片进行缩放,以适应box区域大小
    # region = region.rotate(180) #对图片进行旋转
    region = region.resize((box[2] - box[0], box[3] - box[1]))
    base_img.paste(region, box)
    #base_img.show() # 查看合成的图片
    base_img.save('./schoolCalenderBeCombine.png') #保存图片

        保存的图片schoolCalenderBeCombine.png如下图所示:

    schoolCalenderBeCombine.png

        到了这一步,已经可以将其设置为桌面了,但是通过实际的尝试体验之后,发现白色背景的桌面是真的难看,而且还和桌面上的文件名的颜色有冲突,导致文件名看不清,所以下面将此图片修改一下颜色,例如可以修改为浅×××,代码如下:

    img = Image.open("schoolCalenderBeCombine.png")#读取图片
    width = img.size[0]#长度
    height = img.size[1]#宽度
    i = 1
    j = 1
    for i in range(0,width):#遍历所有长度的点
        for j in range(0,height):#遍历所有宽度的点
            data = (img.getpixel((i,j)))#打印该图片的所有点
            if (data[0]>=220 and data[1]>=220 and data[2]>=220):#RGBA的r值大于170,并且g值大于170,并且b值大于170
                img.putpixel((i,j),(230,228,205,20))#则这些像素点的颜色改色
            #############下面的几行代码是在×××的日期#12月22号#处画个方块##############
            x=1050
            y=715 #每个32
            color=(241,148,148,255)
            if (j>=x and j<=x+35):#真实+260[1050,1060]
                if(i>=y and i<= y+10):#[715,725]
                    img.putpixel((i,j),color)
            if (j>=x and j<=x+10):#真实+260[1050,1060]
                if(i>=y and i<= y+30):#[715,725]
                    img.putpixel((i,j),color)
            if (j>=x+25 and j<=x+35):#真实+260[1050,1060]
                if(i>=y and i<= y+30):#[715,725]
                    img.putpixel((i,j),color)
            if (j>=x and j<=x+35):#真实+260[1050,1060]
                if(i>=y+30 and i<= y+40):#[715,725]
                    img.putpixel((i,j),color)
            #############到这里结束##############
    img = img.convert("RGB")#把图片强制转成RGB
    img.save("schoolCalenderColorChange.png")#保存修改像素点后的图片

        保存后的效果如下图所示:

    schoolCalenderColorChange.png


    三、设为桌面壁纸

        当调出了一张比较满意的壁纸之后,就可以通过Windows的api来进行控制(需要安装的包是pywin32),通过下面的代码(只需要改调用函数时传入的图片地址即可)来进行桌面壁纸的设置(详细的API可以自行去搜):

    def setWallpaper( bmp ):
        import win32api, win32con, win32gui
        k = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
        win32api.RegSetValueEx(k, "WallpaperStyle", 0, win32con.REG_SZ, "0")
        win32api.RegSetValueEx(k, "TileWallpaper", 0, win32con.REG_SZ, "0")
        win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, bmp, 1+2)
    setWallpaper(os.getcwd()+'\\schoolCalenderColorChange.png') #地址要写绝对地址,否则设置完之后,桌面会是一片灰色,同理,如果设置完之后,桌面是什么都没有的灰色,那就说明设置失败了,代码有问题

            设置完成之后的效果如下图所示:

    TIM截图20180913160021.png

        当设置完壁纸之后,工作就结束了,接下来要进行的是后续的清理工作,首先要将生成的几张图片删除掉,代码如下:

    os.remove('schoolCalenderSource.png')
    os.remove('schoolCalenderBeCut.png')
    os.remove('schoolCalenderBeCombine.png')
    os.remove('schoolCalenderColorChange.png')

            当然,还可以修改代码,将所有图片存在内存中,不用非得保存在硬盘上,但是由于我为了看每一步的效果才这么做的,以后有时间再进行完善吧!


    四、Python脚本转为EXE可执行文件

        这一步很简单,需要用到的包为PyInstaller,直接使用pip进行安装即可(pip install pyinstaller)

            这一步需要在python shell中完成,首先将已经编写好的Python脚本单独放到一个文件夹中(因为接下来的操作会生成很多的目录和文件,很可能就不知道那些是原来存在的,那些是生成的没用的),现在我的这个文件在桌面上,接下来打开CMD(WIN+R),先打个“cd ”然后将这个文件拖到CMD中,如下图所示:

    TIM截图20180913161317.png

        这样就快速的切换到脚本保存目录中,通过“dir”命令就可以看到其中的Python脚本了,接下来通过命令来进行编译:

    pyinstaller -F getSchoolCalenderAndSetBackground.py

            如图所示:

    TIM截图20180913161727.png

            当控制台输出这条消息之后,就代表已经编译成功了

    TIM截图20180913161835.png

        然后回到文件夹中,就可以看到编译后的文件了,不过会同时生成很多没用的东西,真正的好东西在“dist”目录下,将这个目录中的".exe"文件取出,就可以运行了(需要注意的是,要在此exe运行的目录下放上之前使用到的“base.png”这个背景图片)



关键字