我叫李林,赶快记住这个名字,不然有一天你我都会后悔的 ^_* 我的油箱:linux_23@163.com,多多交流哦!!! by the way,千万不要太看得起我,我只是一只非常非常鸟的菜鸟罢了!

Python的气泡提醒(windows)

上一篇 / 下一篇  2009-01-07 14:11:29 / 个人分类:python<最近的最爱>

# -*- encoding: GB2312 -*-

from win32api import *
# Try and use XP features, so we get alpha-blending etc.
try:
     from winxpgui import *
except ImportError:
     from win32gui import *

import win32con
import sys, os
import struct
import time

class PyNOTIFYICONDATA:
     _struct_format = (
         "I" # DWORD cbSize;
         "I" # HWND hWnd;
         "I" # UINT uID;
         "I" # UINT uFlags;
         "I" # UINT uCallbackMessage;
         "I" # HICON hIcon;
         "128s" #    TCHAR szTip[128];
         "I" # DWORD dwState;
         "I" # DWORD dwStateMask;
         "256s" # TCHAR szInfo[256];
         "I" #     union {
             #    UINT  uTimeout;
             #    UINT  uVersion;
             #} DUMMYUNIONNAME;
         "64s" #    TCHAR szInfoTitle[64];
         "I" #  DWORD dwInfoFlags;
         #       GUID guidItem;
     )
     _struct = struct.Struct(_struct_format)

     hWnd = 0
     uID = 0
     uFlags = 0
     uCallbackMessage = 0
     hIcon = 0
     szTip = ''
     dwState = 0
     dwStateMask = 0
     szInfo = ''
     uTimeoutOrVersion = 0
     szInfoTitle = ''
     dwInfoFlags = 0

     def pack(self):
         return self._struct.pack(
             self._struct.size,
             self.hWnd,
             self.uID,
             self.uFlags,
             self.uCallbackMessage,
             self.hIcon,
             self.szTip,
             self.dwState,
             self.dwStateMask,
             self.szInfo,
             self.uTimeoutOrVersion,
             self.szInfoTitle,
             self.dwInfoFlags)

     def __setattr__(self, name, value):
         # avoid wrong field names
         if not hasattr(self, name):
             raise NameError, name
         self.__dict__[name] = value

class MainWindow:
     def __init__(self, title, msg):
         message_map = {
                 win32con.WM_DESTROY: self.OnDestroy,
         }
         # Register the Window class.
         wc = WNDCLASS()
         hinst = wc.hInstance = GetModuleHandle(None)
         wc.lpszClassName = "PythonTaskbarDemo"
         wc.lpfnWndProc = message_map # could also specify a wndproc.
         classAtom = RegisterClass(wc)
         # Create the Window.
         style. = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
         self.hwnd = CreateWindow( classAtom, "Taskbar Demo", style, \
                 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
                 0, 0, hinst, None)
         UpdateWindow(self.hwnd)
         iconPathName = os.path.abspath(os.path.join( sys.prefix, "pyc.ico" ))
         icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
         try: hicon = LoadImage(hinst, iconPathName, win32con.IMAGE_ICON, 0, 0, icon_flags)
         except: hicon = LoadIcon(0, win32con.IDI_APPLICATION)
         flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
         nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "Balloon  tooltip demo")
         Shell_NotifyIcon(NIM_ADD, nid)
         self.show_balloon(title, msg)
         time.sleep(3)
         DestroyWindow(self.hwnd)

     def show_balloon(self, title, msg):
         # For this message I can't use the win32gui structure because
         # it doesn't declare the new, required fields
         nid = PyNOTIFYICONDATA()
         nid.hWnd = self.hwnd
         nid.uFlags = NIF_INFO
         # type of balloon and text are random
         nid.dwInfoFlags = NIIF_INFO
         nid.szInfo = msg
         nid.szInfoTitle = title
         # Call the Windows function, not the wrapped one
         from ctypes import windll
         Shell_NotifyIcon = windll.shell32.Shell_NotifyIconA
         Shell_NotifyIcon(NIM_MODIFY, nid.pack())

     def OnDestroy(self, hwnd, msg, wparam, lparam):
         nid = (self.hwnd, 0)
         Shell_NotifyIcon(NIM_DELETE, nid)
         PostQuitMessage(0) # Terminate the app.

def show_msg(title, msg):
     w=MainWindow(title, msg)
     #PumpMessages()

if __name__=='__main__':
     show_msg("有一条消息", "哈哈哈")




#############################################################
呵,要用就直接show_msg(标题,内容)就会出现消息提示,注意编码,还有pywin32模块

TAG: Python python 气泡 源码

引用 删除 Guest   /   2009-06-09 17:32:54
1
引用 删除 Guest   /   2009-03-16 23:07:10
5
引用 删除 Guest   /   2009-01-09 21:50:58
还有就是ctypes扩展模块要装上(2.5已经是标准模块了,2.4却还不是)。
引用 删除 linux23   /   2009-01-09 21:49:31
适用于2.4的版本:

只要改动这几行:
class PyNOTIFYICONDATA:
     _struct_format = (
         "I" # DWORD cbSize;
         "I" # HWND hWnd;
         "I" # UINT uID;
         "I" # UINT uFlags;
         "I" # UINT uCallbackMessage;
         "I" # HICON hIcon;
         "128s" #    TCHAR szTip[128];
         "I" # DWORD dwState;
         "I" # DWORD dwStateMask;
         "256s" # TCHAR szInfo[256];
         "I" #     union {
             #    UINT  uTimeout;
             #    UINT  uVersion;
             #} DUMMYUNIONNAME;
         "64s" #    TCHAR szInfoTitle[64];
         "I" #  DWORD dwInfoFlags;
         #       GUID guidItem;
     )
     #_struct = struct.Struct(_struct_format)

     hWnd = 0
     uID = 0
     uFlags = 0
     uCallbackMessage = 0
     hIcon = 0
     szTip = ''
     dwState = 0
     dwStateMask = 0
     szInfo = ''
     uTimeoutOrVersion = 0
     szInfoTitle = ''
     dwInfoFlags = 0

     def pack(self):
         return struct.pack(self._struct_format,
             struct.calcsize(self._struct_format),
             self.hWnd,
             self.uID,
             self.uFlags,
             self.uCallbackMessage,
             self.hIcon,
             self.szTip,
             self.dwState,
             self.dwStateMask,
             self.szInfo,
             self.uTimeoutOrVersion,
             self.szInfoTitle,
             self.dwInfoFlags)

     def __setattr__(self, name, value):
         # avoid wrong field names
         if not hasattr(self, name):
             raise NameError, name
         self.__dict__[name] = value
引用 删除 Guest   /   2009-01-09 21:43:05
哦,那个是python2.4的问题。2.4的struct模块没有Struct类……
引用 删除 3s4d   /   2009-01-09 08:49:07
加载后 提示struct错误
Traceback (most recent call last):
  File "C:\Python24\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Documents and Settings\3s4d\桌面\Script1.py", line 15, in ?
    class PyNOTIFYICONDATA:
  File "C:\Documents and Settings\3s4d\桌面\Script1.py", line 35, in PyNOTIFYICONDATA
    _struct = struct.Struct(_struct_format)
AttributeError: 'module' object has no attribute 'Struct'
一个道家的程序员的空间 引用 删除 linux23   /   2009-01-07 20:51:01
好像是贴上去的时候系统自己加的,不过谢谢chinayin的提醒
引用 删除 Guest   /   2009-01-07 20:04:57
5
引用 删除 chinayin   /   2009-01-07 20:04:06
刚刚接触python,看lz的文章也挺有意思的
上边的代码style. = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU多了一个点。去掉就好用了。很好玩~
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar