我把 Python 桌面 UI 卷到了这个程度:ctk-kit,一套不像 Tkinter 的组件库

0 阅读7分钟

我把 Python 桌面 UI 卷到了这个程度:ctk-kit,一套不像 Tkinter 的组件库

60 多个控件与变体、毛玻璃背景、实时换主题、完整取色器。全部纯 Python,pip install 即用。

如果你也经历过这些,这篇可能是写给你的:

  • 用 Tkinter 写完功能,一运行,界面像 2005 年的软件;
  • 换成 ttk / ttkbootstrap,控件是能看了,但想改个圆角、加个毛玻璃、做个分段选择器,还是要自己画;
  • 用 PyQt / Electron,包体一下几十上百 MB,只想做个小工具,代价太大。

我花了很长时间做一件事:在纯 Tkinter 的技术栈上,把界面做到「有设计感」。成果就是下面这个项目 —— ctk-kit。

overview.png 它基于 CustomTkinter,但没有停在「换个深色皮肤」这一步:颜色令牌、间距、圆角、自绘控件、浮层、动画,全都重新做过一遍。


一、它到底长什么样

先看几个真实截图,全部来自仓库自带的示例程序,没有 P 图。

按钮与尺寸矩阵

buttons.png

分段选择、开关、勾选框、单选

choices.png

表格(固定表头、隔行底色、列宽自适应) table.png

通知系统(四种级别、两种形态、堆叠与常驻)

notify.png

这些界面有一个共同点:所有控件都共用同一套设计语言。圆角是同一个数值,间距是同一套刻度,颜色全部来自同一组令牌。不是东拼西凑的「能用」,而是看起来像一个产品。


二、Tkinter 为什么做不出这种界面

不是 Tkinter 不行,是它太老了。四个具体问题:

  1. 控件样式能力弱。原生 ttk 的主题是系统级样式表,改一个按钮的圆角要重写整个主题;想给开关做一个「圆球滑过去」的效果,基本没门。
  2. 没有统一的设计令牌。颜色、间距、字体散落在每个 configure() 里,想整体调一下主色,得全局搜字符串。
  3. 浮层、动画、阴影全靠手写。下拉面板、右键菜单、提示、对话框,每个都要自己算位置、自己处理失焦关闭。
  4. 高分屏和圆角是坑。DPI 缩放错位、窗口圆角裁不干净,做出来的东西总差一口气。

ctk-kit 就是把这四件事一次性解决掉。


三、好看在哪:四个设计决策

1. 颜色只有一套,但改起来是实时的

项目只有一套毛玻璃配色,所有颜色都是 tokens 里的字符串常量:

COLOR_BG      = "#0e0f12"   # 窗口底
COLOR_CARD    = "#181920"   # 卡片底
COLOR_ACCENT  = "#3E4059"   # 主按钮
COLOR_ACTIVE  = "#606269"   # 选中块、开关、勾选

改主题不需要重启,也不需要重建页面:

from ctk_kit import theming

theming.apply_palette({
    "COLOR_ACCENT": "#f97316",   # 主按钮变橙
    "COLOR_ACTIVE": "#22c55e",   # 选项主色变绿
})

窗口里已经存在的控件会立刻换色,包括用 Canvas 和 Pillow 自绘的开关、滑块、分段选择器 —— 这是我认为它和大多数「换肤库」最大的区别。

theme_compare.png 左:默认配色。右:改了两个令牌之后。注意分段选择、开关、勾选、单选、进度条全都跟着变了。

不想要了?

theming.reset_palette()   # 一键回到默认

2. 毛玻璃不是贴图,是系统级合成

在 Windows 11 上,窗口底层用的是 DWM 的 Acrylic / Mica 合成。卡片、输入框这些实色控件浮在玻璃上,窗口边缘是真正的圆角。

内置四套主题:毛玻璃 / 深空 / Acrylic / Mica。切换只改合成方式和 tint,不动控件本身:

app.set_glass_options(kind="acrylic", color="#181A20")

3. 控件是画出来的,不是拼出来的

开关、勾选、单选、滑块、进度条、分段选择器、圆环进度,全部是自绘的。这意味着:

  • 颜色跟着令牌走,能实时变;
  • 圆角、描边、阴影可调;
  • 高分屏下按 DPI 缩放,不会糊。

比如开关,关闭态、开启态、悬停态是分别绘制的,圆球颜色、轨道混色都有独立令牌。

4. 交互细节是统一实现的

这一点最容易被忽略,但最影响「像不像一个正经产品」:

  • 大部分控件都有 hover / focus / disabled 三种状态;
  • 下拉面板、右键菜单、悬浮提示用同一套浮层样式和同一套颜色;
  • 通知会自动堆叠、避让、淡入淡出;
  • 取色面板带色盘、明度条、RGB/HSV/HSL 三种模式、12 个参考色。

四、功能清单

项目有 54 个模块、2.1 万行 Python、128 个公开名字。按功能分:

分类组件
基础App(根窗口)、Frame、Card、PageHeader、Scrollable、分割线
按钮PrimaryButton、SecondaryButton、DangerButton、FlatButton、SoftButton
输入FormEntry、TextArea、Checkbox、Switch、Slider、Segmented、Spinner、ProgressBar
选择Radio、Check、DropField、TagSelectField、TreeSelectField、Stepper
数据展示Table、TreeView、LazyList、Pagination、Tabs、Timeline、Breadcrumb
日期时间Calendar、DatePicker、TimeField、TimePicker
反馈Notifier / notify、Tooltip、LoadingOverlay、Skeleton、Progress、RingProgress
浮层Dialog、Popover、ContextMenu、MenuBar、ColorPicker / ColorDialog
布局Splitter、Collapsible、Wizard、Steps、Carousel
媒体ImageViewer、Avatar、Badge、Tag
导航SidebarNav、PageBase、PageRebuilder

extras.png


五、上手:十行跑起来

安装:

pip install ctk-kit

最小示例:

from ctk_kit import App, Card, PageHeader, PrimaryButton

app = App(title="全部记录", size=(880, 560), appearance="dark")

header = PageHeader(app, "全部记录")
header.info.configure(text="共 12 条")
header.pack(fill="x", padx=20, pady=(16, 8))

box = Card(app)
box.pack(fill="x", padx=20, pady=8)
PrimaryButton(box, "新建", lambda: app.notify("已保存")).pack(padx=16, pady=16)

app.mainloop()

跑起来就是一个带标题栏、卡片、主按钮、通知的窗口,不需要自己拼样式。

想看完整体验,直接跑仓库里的示例:

python examples/basics/window.py

示例有 16 个页面,大部分卡片都带「查看实现」的折叠代码块,可以直接抄。


六、几个我自己最常用的能力

完整取色器

不是简单的色板,是带色盘、明度条、三种色彩模式、参考色的完整面板。右键菜单还能复制 / 粘贴颜色(剪贴板不是合法颜色时,粘贴项会自动灰掉)。

color_dialog.png

from ctk_kit import ColorPicker

picker = ColorPicker(parent, value="#4c4b98", command=lambda c: print(c))

表格

固定表头、隔行底色、列宽自适应、超过行数自动滚动、空数据占位,开箱即用。树形数据用 TreeView,同样是一套配色。

from ctk_kit import Table

table = Table(parent, [("名称", None), ("状态", 120), ("大小", 100)])
table.set_rows([
    ["config.json", "正常", "12 KB"],
    ["keys.bak", "已归档", "248 KB"],
])

悬浮提示

浮层样式和下拉面板、右键菜单完全一致,不用系统毛玻璃(一小块浮层糊了背景反而看不清)。

tooltip.png

from ctk_kit import Tooltip

Tooltip(save_button, "保存当前草稿")
Tooltip(entry, lambda: f"当前长度 {len(entry.get())}", delay=300)

七、和别的方案比,它适合谁

公平地说,它不是万能的:

方案优点代价
原生 Tkinter / ttk零依赖、包最小界面停留在系统样式,定制成本极高
ttkbootstrap主题多、生态成熟本质还是 ttk 样式表,自绘控件和实时换色做不了
ctk-kit自绘控件、实时换色、毛玻璃、组件全只有一套深色配色;毛玻璃依赖 Windows 11
PyQt / PySide能力最强、控件最全包体大、License 需注意、学习曲线陡
Electron / TauriWeb 生态、界面自由体积和内存代价大,纯 Python 项目集成麻烦

它适合你,如果:你在写内部工具、小工具、原型、教学项目,希望几十行代码就有产品级的界面,又不想引入几十 MB 的运行时。

它可能不适合你,如果:你需要多套配色同时存在、需要跨平台一致的毛玻璃效果、或者需要极其复杂的数据网格。


八、项目地址

当前版本 0.11.0,支持 Python 3.8 – 3.14,依赖只有 Pillow 和 conf_base。

如果这个项目对你的界面有一点帮助,欢迎 star;有想要的控件,也可以直接提 issue —— 示例里那 16 个页面就是按「一个控件一页」组织的,加东西很快。


本文所有截图都来自 ctk-kit 自带的示例程序,欢迎自己跑一遍对比。