Python使用winIco编写一个托盘图标不停闪烁的小程序

昨天测试了使用Tkinter来编写简单的托盘程序,总体说来是非常方便的,代码在Windows和Linux下都能很好地工作。

Windows下,Tkinter可以使用封装好的winIco API: tktable/winico
下载最新的0.6即可。 (05年发布,有人提到64位系统下无法正常工作,我没有测试)
另外,还可以参考这个TCL项目: http://cran.r-project.org/web/packages/tcltk2/

里面有个package ico1.0,是在winIco的基础上修改的,但是它的接口已经改变,如果你对TCL脚本熟悉,建议使用。

1. 解压dll到tcl文件夹

下载winIco0.6之后,直接解压到tcl文件夹下,类似: D:\Python27\tcl\winico0.6。
测试python下是否可用:

>>> from Tkinter import Tk
>>> root = Tk()
>>> root.tk.call('package', 'require', 'Winico')
'0.6'

2. 合成不同的图标到一个ico文件

程序在托盘不停闪烁图标,利用了在一个ico文件中,可以集成多个不同大小、颜色的图标资源。
我使用了Greenfish Icon Editor Pro来合并图标文件:
join-icons
第一个图标对应的是#0,第二个图标对应的是#1。还可以继续添加其他需要使用到的图标。

3. python调用winIco

winIco提供的接口非常简单:http://www.lijiejie.com/python/winico/winico.html

  1. 使用createfrom可以直接从ico文件创建图标资源。
  2. load命令可以从exe或dll中加载图标资源
  3. info命令则是获取某个句柄对应的若干图标资源的信息:  包括编号、大小、颜色深度
  4. taskbar命令用于添加、修改、删除托盘图标,重要的参数包括了-callback(回调函数)、-pos(图标资源序列号)、-text(托盘图标的提示文本),在回调函数中,可以通过%m参数来传递窗口消息。

在添加托盘图标时,可以用-callback参数指定回调函数,比如右键点击弹出菜单。

我写了一个简单的示例程序:
flash-trayicon-sample
这个地球图标会不停闪烁(0.5秒切换一次),右键单击,可弹出一个菜单。 源代码在这里

Python Tkinter写的一个POST工具[源代码]

昨天想复习一下使用Tkinter开发GUI程序,练手写了一个简单的POST工具。    源代码

必须的package有:

前者用于在linux下显示GIF窗口图标,后者用于检查文本编码,以便完成自动解码unicode。

写代码过程中遇到的问题有:

  1.  linux和mac下的图标问题
  2.  窗口屏幕居中的问题
  3.  Tkinter不支持多线程

对于第三个问题,因为Tkinter是单线程的,因此捕获到按钮点击后,需要创建另一个线程完成post动作。

自然,也可以在command对应的函数中完成HTTP请求了,但会面临窗口不能及时响应的问题。

也就是说,在HTTP请求结束前的一两秒内,窗口是无响应的。

另外,也正因为Tkinter不支持多线程。

错误提示将以红色的文本显示在Response相应的文本框中,而不是消息框提示。

在另一个线程改变文本框的内容是安全的,但创建MessageBox就不是这么回事了。

TkPostTool

Tkinter窗口在屏幕居中的问题

为了让程序窗口在不同的平台和计算机上都能良好的显示,需要考虑:

1. 窗口的大小

2. 窗口的位置

对于第一点,因为默认字体不同,应该尽量避免固定长宽,而让geometry manager(图形管理器)自己去计算所需的大小。但可以设置各个部件之间的间隙大小。

对于这一点,我还想提一下tkinter中的entry和text这两个widget,他们的height和width都是表示可以输入的英文字数,而不是像素值。只有这样,同样的文本内容,才可以在windows、linux下展现一致。而不会windows下在A处换行了,而ubuntu却在B处换行。

Tkinter的窗口屏幕居中有点烦人,没有现成的method,但我找到了一种可行的方法。简单说明:

1. 屏幕的分辨率是非常容易获取到的,直接通过root.winfo_screenwidth()、root.winfo_screenheight() 继续阅读Tkinter窗口在屏幕居中的问题

Tkinter在Ubuntu设置窗口图标遇到的问题

使用Tkinter Package来开发Python GUI程序是非常迅速的,但是它的一些细节不太完美。

在windows环境,设置窗口图标只需要一行代码:

root.iconbitmap(default='myicon.ico')

但这行代码在Ubuntu上无法正常工作,提示myicon.ico not defined。

实际上,我在ubuntu上将图标换成一个x bitmap,依然无法正常工作。

解决在Ubuntu和Mac上出现的这个问题:

1. 安装PIL(python imaging library),支持更多的图像格式,建议制作gif格式64×64做为图标

2. iconbitmap函数封装了tk的iconbitmap窗口消息,我们换成使用Tkinter一个未封装的iconphoto消息

3. windows和linux可以使用同样的代码,也可以根据os.name分支

 

安装PIL

PIL的地址是:http://www.pythonware.com/products/pil/,我选择的是最新的1.17

下载解压之后,还不能立即安装,执行:

apt-get install python-dev

apt-get install libjpeg-dev

前者提供需要的头文件,后者安装了所需的jpeg decoder。

然后,在setup.py中跳到214行

add_directory(library_dirs, "/usr/lib")

在它前面添加:

add_directory(library_dirs, "/usr/lib/i386-linux-gnu")

参考: http://stackoverflow.com/questions/8479344/pil-encoder-jpeg-not-available

随后即可正确安装:

./setup.py build

./setup.py install

我们的python代码可以这样写:

from ImageTk import PhotoImage
icon = PhotoImage(file='icon.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)

可以看到这里是发送的window message iconphoto。

windows下效果:

tkinter-icon-windows

Ubuntu VPS上截图:

tkinter-icon-ubuntu