关于python 编写的exe软件 最小化到托盘的分享适用于Tk,以及打包exe后找不到wininco package的解决办法


最近闲暇在公司写了一个打卡程序。采用Tkinter 做了简单的界面。Tkinter编写界面的教程还是很多的,这里就不多说了。

开发过程中困难的,就是让程序运行到 屏幕右下角的托盘里。网上找资料 大部分都是只言片语,我总结归纳下,分享给大家。

对于 用tkinter编写的 gui程序,托盘运行网上 提到最多的就是 采用 winico、winIco API: tktable/winico

本人亲试64位系统有效。下载winico 后 需要手动将其解压到 python安装目录的tcl目录下,这样程序才能调用。

winic的具体信息可以查看文档 http://www.lijiejie.com/python/winico/winico.html

我从其他人那里复制了以下总结的文字,http://www.lijiejie.com/python-winico-flash-trayicon/ 原文出处,我非常感谢这位作者。他在最后贡献了他的源码地址,不然我还要花很多时间研究如何调用。

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

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

简单的代码如下:

 

  """ 可能的鼠标事件:
    WM_MOUSEMOVE
    WM_LBUTTONDOWN
    WM_LBUTTONUP
    WM_LBUTTONDBLCLK
    WM_RBUTTONDOWN
    WM_RBUTTONUP
    WM_RBUTTONDBLCLK
    WM_MBUTTONDOWN
    WM_MBUTTONUP
    WM_MBUTTONDBLCLK"""

def menu_func(event, x, y):
if event == 'WM_RBUTTONDOWN': # 监听右击事件
menu.tk_popup(x, y) #弹出菜单
if event == 'WM_LBUTTONDOWN': #左 事件 还有其他的如 WM_LBUTTONDBLCLK 左双击
top.deiconify() #显示主页面


top = Tkinter.Tk()
top.tk.call('package', 'require', 'Winico')
icon = top.tk.call('winico', 'createfrom', 'xxx.ico') # 这里说一下xxx.ico 就是你要显示在托盘上的小图标
top.tk.call('winico', 'taskbar', 'add', icon,
'-callback', (top.register(menu_func), '%m', '%x', '%y'),
'-pos', 0,
'-text', u'打卡程序')
menu = Tkinter.Menu(top, tearoff=0)
menu.add_command(label=u'显示主页面', command=top.deiconify)
menu.add_command(label=u'退出', command=top.quit)


我的源码由于公司原因不能上传,有代码上的问题,可以邮箱问我 andyzhang.yan@qq.com
网上还有一个模块是 SysTrayIcon.py  托盘模块下载地址:http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html

本人也尝试用过,不过在使用过程中,从托盘还原到主界面时出现了卡死现象,个人没有深入去解决。如果有大神尝试,最好能分享一下如何解决 还原主界面时卡死的现象。(如果没遇到这问题 最好也分享一下代码,不盛感激)

关于打包后找不到 winico package的问题
本人用pyinstaller 打包exe后,运行提示找不到 winico package,个人的解决办法是 打包时不要打包成一个文件。也就是不要有-F选项。然后再打包好的目录中 会有一个tcl文件夹,

将winico文件夹 复制到里面就能解决问题。用py2exe的童鞋 应该也可以用这种方法解决吧。
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM