用Python实现Windows上的气泡提醒

本文将介绍如何使用Python编写代码实现创建托盘通知的功能,在Windows XP和Windows Server 2003环境下有效。代码中包含了创建窗口类、注册窗口、显示通知等关键步骤,并通过实例演示了如何调用相关API来实现托盘通知的显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文来自: http://www.3snews.net/html/50/550-20986.html

我稍微改了下而已,经试验在XP,2003下有效。

# -*- encoding: gbk -*-

import sys
import os
import struct
import time
import win32con

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


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; 版本(0 for V4, 3 for V5)
        # } DUMMYUNIONNAME;
    "64s" #    TCHAR szInfoTitle[64]; 气球提示标题
    "I" # DWORD dwInfoFlags; 气球提示图标
  )
  _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, duration=3):
    # Register the Window class.
    wc = WNDCLASS()
    hinst = wc.hInstance = GetModuleHandle(None)
    wc.lpszClassName = "PythonTaskbarDemo" # 字符串只要有值即可,下面3处也一样
    wc.lpfnWndProc = { win32con.WM_DESTROY: self.OnDestroy } # 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(duration)
    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[:64]
    nid.szInfoTitle = title[:256]

    # 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.

if __name__=='__main__':
  MainWindow("您有一条短消息", "您该睡觉了")



<think>嗯,用户想用Jupyter Notebook和Python库生成世界大学排名的地图可视化。首先,我需要确定他们可能需要哪些步骤。首先,数据准备是基础,可能需要一个包含大学排名、地理位置(经纬度)等数据的CSV文件。接着,用户需要安装必要的库,比如pandas处理数据,geopandas或plotly做地图可视化。 然后,数据清洗可能涉及到处理缺失值,特别是经纬度信息,如果数据里没有,可能需要通过地理编码API获取,比如geopy库。不过这可能增加步骤复杂度,用户可能需要注册API密钥,比如Google Maps的,但免费版可能有次数限制,需要注意提醒用户。 接下来,选择合适的地图库。Matplotlib虽然基础,但做地图可能不够直观,需要配合basemap工具包,不过安装可能有点麻烦。而Plotly Express更简单,交互性更好,适合在Jupyter中展示,所以可能推荐Plotly。 然后,具体步骤包括导入库、读取数据、检查数据、创建地图。Plotly的例子可能需要用scatter_geo或choropleth,但choropleth通常需要地理数据如国家边界,而大学作为散点可能更适合用scatter_geo。颜色和大小可以代表排名,比如颜色越深代表排名越高,或者用气泡大小表示。 另外,用户可能需要考虑地图的样式,比如深色背景,或者调整标记的透明度。还要注意地理范围的设置,确保所有数据点都能显示出来。 可能的问题:用户的数据是否包含国家名称或ISO代码?如果只有大学名称,可能需要地理编码步骤,这部分可能需要额外代码。或者用户的数据集是否已经有经纬度?如果没有,需要指导他们如何添加,比如用geopy的Nominatim,但要注意速率限制。 另外,安装库的时候,geopandas可能依赖其他库,比如GDAL,在Windows上安装可能比较麻烦,可能需要conda安装。用户如果遇到问题,可能需要建议使用conda或者检查系统依赖。 最后,生成地图后,保存为HTML或截图,方便分享。同时,提醒用户可能需要调整参数,比如zoom、height等,以便更好地显示。 总结步骤:安装库→加载数据→处理地理数据→生成地图→调整样式→保存结果。需要分步解释,代码示例要详细,并注释关键部分。可能的相关问题包括如何处理缺失的地理数据,如何优化地图视觉效果,以及如何将结果导出。</think>以下是在Jupyter Notebook中使用Plotly实现世界大学排名地图可视化的分步指南: ### 一、环境准备 1. 安装必要库(在Jupyter单元格执行): ```python !pip install pandas plotly geopandas ``` ### 二、数据准备 1. 创建示例数据文件`universities.csv`,包含字段: ```csv name,country,latitude,longitude,ranking MIT,USA,42.359,-71.092,1 Stanford,USA,37.428,-122.169,2 Cambridge,UK,52.205,0.119,3 ... ``` ### 三、完整实现代码 ```python import pandas as pd import plotly.express as px # 数据加载与预处理 df = pd.read_csv('universities.csv') df = df.dropna(subset=['latitude', 'longitude']) # 清除缺失地理坐标的数据 # 创建交互式散点地图 fig = px.scatter_geo(df, lat='latitude', lon='longitude', hover_name='name', size='ranking', # 排名数值越小气泡越大 color='ranking', color_continuous_scale=px.colors.sequential.Plasma_r, # 颜色反向渐变 projection='natural earth', title='世界大学排名分布') # 样式优化配置 fig.update_geos( showcountries=True, countrycolor="lightgrey", showocean=True, oceancolor="lightblue" ) fig.update_layout( height=800, margin={"r":0,"t":40,"l":0,"b":0}, coloraxis_colorbar=dict( title="排名", tickvals=[1, 50, 100], ticktext=["Top 1", "Top 50", "Top 100"] ) ) # 显示结果 fig.show() # 保存为HTML文件 fig.write_html("university_ranking_map.html") ``` ### 四、关键技术点说明 1. **数据规范**:需确保数据集包含准确的地理坐标(经纬度),缺失坐标可通过[OpenStreetMap Nominatim API](https://nominatim.openstreetmap.org/)补全[^1] 2. **视觉编码**: - `size`参数将排名数值转换为气泡大小(数值越小气泡越大) - `color_continuous_scale`使用反向色阶突出显示顶尖院校 3. **交互特性**:默认支持缩放、平移、悬停显示详细信息等交互操作 ### 五、扩展优化建议 1. 添加国家边界图层: ```python fig.add_trace(px.choropleth( geojson=geopandas.datasets.get_path('naturalearth_lowres'), locations=countries_df['iso_alpha'] ).data[0]) ``` 2. 集成实时数据更新: ```python import ipywidgets as widgets from IPython.display import display year_selector = widgets.Dropdown(options=[2020,2021,2022]) display(year_selector) def update_map(year): filtered_df = df[df['year'] == year] fig.data[0].update(filtered_df) year_selector.observe(update_map, names='value') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值