用 tkinter 可实现最小可用便签:启动快、无额外依赖、打包后单文件体积小,无需 Electron 或 PyQt 等重型框架。

用 tkinter 做最小可用便签,别碰 Electron 或 PyQt
纯 Python 桌面便签没必要上重框架。用系统自带的 tkinter 足够——启动快、无依赖、打包后单文件体积小(通常 Tk() 默认窗口边框和标题栏,否则不像便签。实操时直接用 root.overrideredirect(True),再手动加拖拽逻辑。
常见错误是调用 geometry() 前没等窗口渲染完,导致位置偏移。正确做法是绑定 ;另外 macOS 上需额外调用 root.after(10, lambda: root.geometry(...))root.lift() 和 root.focus_force() 才能确保置顶生效。
示例核心片段:
import tkinter as tk
root = tk.Tk()
root.overrideredirect(True) # 去掉标题栏
root.attributes('-topmost', True)
text = tk.Text(root, bg='#fffaf0', font=('Segoe UI', 12), wrap=tk.WORD)
text.pack(fill=tk.BOTH, expand=True, padx=8, pady=6)
root.after(10, lambda: root.geometry('300x200+100+100'))
Windows 下用注册表实现开机自启,别写计划任务
计划任务配置复杂、权限提示多、用户容易关掉;注册表方式静默可靠,且所有 Windows 版本都支持。目标路径是 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,写入字符串值,名称任意(如 StickyNotePy),数据为 Python 脚本的绝对路径(或打包后的 exe 路径)。
注意三点:
- 路径中含空格必须用英文双引号包裹,例如
"C:\My Tools\note.exe",否则注册表会截断 - 如果用 .py 脚本而非 exe,必须指定 pythonw.exe(避免弹黑窗),完整值应为
"C:\Python39\pythonw.exe" "D:\note.py" - 首次写入需管理员权限?不需要——
HKEY_CURRENT_USER普通用户可写,但脚本路径本身得有读取权限
macOS 用 launchd plist 实现后台自启,不是 login item
Login Item 只在用户登录 GUI 后才拉起,且会显示 Dock 图标;而便签需要随系统启动就运行(比如从休眠唤醒后立刻可用)。必须用 launchd,配置文件放在 ~/Library/LaunchAgents/ 下,文件名以 com.yourname.stickynote.plist 格式命名。
关键字段不能错:
-
KeepAlive设为true,否则程序退出后不会自动重启 -
RunAtLoad必须为true,保证登录即启动 -
StandardOutPath和StandardErrorPath建议设成/tmp/stickynote.log,方便查启动失败原因(常见于 Python 路径不对或 tkinter 初始化失败)
加载命令:launchctl load ~/Library/LaunchAgents/com.yourname.stickynote.plist;卸载用 unload。改完 plist 必须 reload,否则不生效。
打包成独立 exe 或 app 时,tkinter 资源路径容易崩
用 PyInstaller 打包后,__file__ 指向临时解压路径,图标、配置文件若用相对路径会找不到。必须用以下方式获取真实资源根目录:
import sys
import os
def resource_path(relative_path):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
icon_path = resource_path("note.ico") # Windows 图标
macOS 打包成 app 后,tkinter 的字体可能回退成 Helvetica——因为打包时没带字体资源。解决方案:要么显式设置 font=('San Francisco', 12)(macOS 系统默认字体),要么用 --add-data 把字体文件打进 bundle 并手动加载。
自启配置也要跟着打包走:Windows 注册表写入逻辑里,路径要用 resource_path() 处理后的 exe 绝对路径;macOS 的 plist 文件也得在打包后动态生成并写入 ~/Library/LaunchAgents/,不能靠手动放。
最常被忽略的是:macOS Gatekeeper 会拦截未签名的 app 启动,首次运行需右键「打开」绕过;而 Windows SmartScreen 可能误报 pyinstaller 打包的 exe 为风险软件——这两处没有技术解法,只能提前告知用户。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











