自从接触python,就被他优雅而简洁的代码所吸引。
举个例子:
arr , , , , , , , , , , , , , ]
]

如果用其他语言来写的吗,不会这么简洁,美观。
 
python还有更强大的特性,它有非常丰富的类库,以至于它几乎能完成大多数语言都能完成的工作。比如写网站、写软件、写游戏、写服务器、嵌入式开发等。
 
最近出门总是天公不作美,仔细想想是忘了看天气预报了。于是就想找个桌面天气软件,这样一打开电脑就能看到天气了,关电脑前也可以看一眼明天的天气。
在百度里面找到了好几款桌面天气软件,大都不完美,不是自己想要的效果(有的是界面不美观,有的是里面夹杂着其他程序过于累赘,有的是快捷键冲突了,有的是只能看当前天气不能看明天天气等等)。
当然也有一款个人感觉挺满意的。后来想了下,既然python这么强大,那么用python写一个这样的软件岂不是更好,想要什么功能,就写什么功能。
 
于是就开始了我的python桌面天气预报的庞大工程。(为什么说庞大呢,后面就知道了。)
 
由于我是做界面开发的,之前学python的时候就顺便学了wxPython这个强大的类库。于是就用wxPython来写。
 
写之前肯定先要解决几个问题:1、天气数据的获取与分析。2、能够贴在桌面上,鼠标穿透,像桌面背景一样。3、要背景透明。
 
 
1、很容易解决网上的api一大堆,可以百度一下。
2、我也找到了办法就是用User32.dll里面的SetWindowLongA方法。具体的python代码是这么写的
selfWnd )
Ret = Ret | 0x00080000 | 0x00000020
ctypes.windll.user32.SetWindowLongA(selfWnd, -20, Ret)
3、这个是最麻烦的了,也是浪费我时间最多的一个。
 
最开始在wxPython里面找到一个叫SetTransparent()的方法,试了下发现是设置整个窗口的透明度的,不是设置背景的透明度的。又想到把一张png图片作为背景图片不就行了吗。
用尽了各种方法后发现即使用png作为窗口的背景,窗口原来的背景也会同时存在的。相当于就是用一张图片浮在窗口背景上了,没达到我要的背景透明的效果。
后来发现wxPython有个ShapedWindow的例子,可以实现用图片作为背景的效果。
代码就不贴了,效果是这样子的
跟我要的效果很接近。如果再把这张图片做成半透明的,那么就是我要的效果了。
于是百度、谷歌狂搜,也没找到个方法来,最后从各种搜索结果中发现了两个问题:
1、这张作为背景的图片是不支持alpha通道的,即使图片有透明度也不行,虽然wxPython有将png图片显示在程序里的例子,但是作为背景的话,是不可能的。
2、这张图片显示区域之外的部分是显示不出来的。如图:
文字其实是有红框那么长,但是由于在这张图片的区域之外,所以就没有显示出来。
 
后来在网上发现有个用tkinter实现的背景透明为文字不透明的方法,如图:
基本上是我想要的效果。
于是又重燃了我学习tkinter的决心,放弃用wxPython了,之前一直没有研究这个python内置的Gui工具。
 
放弃用wxPython来写这个程序还有其他方面的原因:
1、不能实现我想要的用透明背景图片作为窗口的背景。
2、wxStaticText这个文本显示控件,是有背景的,默认的背景是从父级继承过来的。网上有办法可以擦除背景,但是对于右对齐的文字来说,在重绘的时候,会出现文字重叠如图:
正常情况下:,重叠的情况:,这个文字被重绘了好几遍。
3、由于要实现鼠标穿透效果,需要获取窗口句柄,而wxPython没有任何一个方法可以返回自己的窗口句柄。
虽然可以通过 selfWnd = ctypes.windll.user32.FindWindowA("wxWindowClassNR", None) 来获取句柄,
但是这个方法不可靠,因为窗口类名wxWindowClassNR不是唯一的,用spy++可以看到有好多窗口的类名都是
这个名字。这种方法会造成,返回的不是自己窗口的句柄,而是别人窗口的句柄。
 
 
俗话说 磨刀不误砍柴工,我把tkinter入门,各个组件的介绍,使用方法,例子都看了一遍,都一一测试过,防止学的时候没学好,理解不透彻,导致用的时候碰到各种问题。
 
.........
 
n天后,已经学的差不多了,就开始用tkinter来写这个程序。窗口透明效果很容易就实现了。
代码如下:
root[
,
 
, y, anchor=Tkinter.NW)
 
root.bind("<ButtonPress-1>", StartMove)
root.bind("<ButtonRelease-1>", StopMove)
root.bind("<B1-Motion>", OnMotion)
 
root.mainloop()
这是效果图:
 后面的颜色是我的桌面,可以看到,背景完全透明了。文字也没有像wxPython那样被切割掉。
但是有一个很明显的问题,文字变得不清晰了。
这是在win7下的效果但是在xp下就显示正常了,如图:
现在都用win7了 不可能写个程序只能在xp下运行吧。所以得找解决办法。
又百度、谷歌狂搜,最后还是在python自带的文档里找到了这么一句话:
like anti-aliased font rendering under X11, window transparency (on X11 you will need a composition window manager) will be missing.
意思是字体抗锯齿、窗口透明在window下将会丢失。
就说是tkinter里面是没有抗锯齿和窗口透明功能的。之前的透明方法只是把特定颜色透明了,并不是真正意义上的透明。tkinter里面是没有alpha通道的。所以用半透明图片做背景是不可能实现的。
 
不过tkinter相比wxPython来说有个优点就是它可以返回窗口句柄了,print hex(root.winfo_id())
 
 
无奈之下,只好再找其他的python GUI工具了。
接下来装了个pygtk,但是装上之后,导入时会报错,大概意思是缺少某个dll文件。我都是按照教程安装的。
后来在虚拟机的xp系统里面装了下,却没有报错。
真是奇怪了,同样的几个文件,同样的安装顺序,在win7下装完后有问题,在xp下就正常运行。
我估计是某个pygtk用到的dll文件在win7和xp里面不一致导致的。
搜了下发现网上也有人遇到同样情况的,但是基本上找不到解决方案,或者说很难找,于是就暂时放弃了。
 
之后又装了个pyqt,安装过程也很方便,有个独立安装包,直接安装就行,可以正常运行。
看了里面的例子后顿时感觉:“梦里寻她千百度,蓦然回首,那人却在灯火阑珊处。”
真是太好了,由于我是做actionscript开发的,发现qt几乎能实现flash的所有功能。
 
再次,磨刀不误砍柴工。先看基础吧。
 
经过一番努力和研究之后,终于实现了我想要的效果了。
先贴图看下效果:
 
pyqt里面实现窗口无边框的是:
self.setWindowFlags(QtCore.Qt.FramelessWindowHint|QtCore.Qt.SubWindow|QtCore.Qt.WindowStaysOnBottomHint)
实现背景透明的是:
self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
我写了个函数来实现鼠标穿透的切换:
)
    ].data)
    , ret)
 
源码放在百度网盘里了,有想研究的可以看下。
http://pan.baidu.com/s/1mntsc

用python写桌面天气预报,自己的学习曲线。的更多相关文章

  1. 夏日炎炎 python写个天气预报

    东南地区连续突破历史,江浙沪除了包邮之外的另一福利-桑拿也已到手.这样的日子里是应该每日关注天气主义降暑避免出现热疾病,python包含比 较多的网络应用类这样就方便了一些网络应用的操作,之外还有些可 ...

  2. 用aardio给python写个图形界面

    前阵子在用python写一些小程序,写完后就开始思考怎么给python程序配一个图形界面,毕竟控制台实在太丑陋了. 于是百度了下python的图形界面库,眼花缭乱的一整页,拣了几件有“特色”有“噱头” ...

  3. python写zip破解器

    浏览桌面依然平静,!!!!等等..怎么有个压缩包 打开一看!!!156.txt???waht the fuck? 卧槽还有密码!!!!!! 但是我不知道╮(╯▽╰)╭该怎么办呢! 很简单,python ...

  4. 如何Python写一个安卓APP

    前言:用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择,而且实在不想学习Java,再者,就编程而言已经会的就Python与Golang(注:Python,Golang水平都一般 ...

  5. 快速掌握用python写并行程序

    目录 一.大数据时代的现状 二.面对挑战的方法 2.1 并行计算 2.2 改用GPU处理计算密集型程序 3.3 分布式计算 三.用python写并行程序 3.1 进程与线程 3.2 全局解释器锁GIL ...

  6. Python写各大聊天系统的屏蔽脏话功能原理

    Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时 ...

  7. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  8. Python写地铁的到站的原理简易版

    Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...

  9. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

随机推荐

  1. 四,php异常处理

    1,异常处理 异常处理用于在指定的异常或错误发生时,改变脚本的正常执行流程. <?php try{ //错误或异常 }catch (Exception $ex){ //处理异常 //抛出异常 } ...

  2. 【bug】使用微信分享SDK,配置成功但分享信息异常

    使用微信JSD做H5分享功能时,显示配置成功,但分享出去的信息并不是配置中的信息.(p.s. ios 分享后只有一个当前的链接,androd连分享的图标都没有), 最终找的的原因是:分享的链接中,参数 ...

  3. 常见无线组网分析(NB-IOT组网和Mesh组网)

      NB-IOT LoRa Zigbee WIFI 蓝牙 组网方式 基于现有蜂窝组网 基于LoRa网关 基于Zigbee网关 基于无线路由器 居于蓝牙Mesh的网关 网络部署方式 节点 节点 + 网关 ...

  4. vue中axios访问Java后端跨域问题解决

    问题背景: 前后端分离,前端选用Vue,后端选用Java,vue编译出的静态页面采用ngix发布,在前端访问后端时出现跨域问题. 解决方法: 跨域的问题解决方法有好多种,这里是通过服务端解决,以下是代 ...

  5. 彻底弄懂JS的事件冒泡和事件捕获(不推荐阅读)

    由于搬去敌台了,好久没来博客园,今天无意中翻到有“误认子弟”的评论,这里特意做个说明. 本文中关于事件冒泡和事件捕获的描述和例子都是OK的,错就错在后面用jquery去展示了利用事件冒泡的例子有误,其 ...

  6. Python小白学习之路(十七)—【内置函数二】

    序列操作类函数 all() 功能:判断可迭代对象的每个元素是否都为True值注意:If the iterable is empty, return True.(举例3) 回顾:None     ''  ...

  7. 在vue项目中使用swiper2.7.6

    $ npm install swiper@2.7.6 --save-dev npm WARN rollback Rolling back node-pre-gyp@0.10.0 failed (thi ...

  8. cobbler koan自动重装系统

    介绍 koan是kickstart-over-a-network的缩写,它是cobbler的客户端帮助程序,koan允许你通过网络提供虚拟机,也允许你重装已经存在的客户端.当运行时,koan会从远端的 ...

  9. 剑指offer二十四之二叉树中和为某一值的路径

    一.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二.思路 详见代码 三.代码 1.解答代码 im ...

  10. How React Works (一)首次渲染

    How React Works (一)首次渲染 一.前言 本文将会通过一个简单的例子,结合React源码(v 16.4.2)来说明 React 是如何工作的,并且帮助读者理解 ReactElement ...