GitHub地址: https://github.com/TomSchimansky/CustomTkinter
官网: https://customtkinter.tomschimansky.com/
官方教程文档:https://customtkinter.tomschimansky.com/documentation/

介绍

CustomTkinter 是一个基于 Tkinter 的 python UI 库,它提供了新的、现代的和完全可定制的小部件。它们像普通的 Tkinter 小部件一样创建和使用,也可以与普通的 Tkinter 元素结合使用。小部件和窗口颜色适应系统外观或手动设置的模式(‘light’,‘dark’),并且所有 CustomTkinter 小部件和窗口都支持 HighDPI 缩放(Windows,macOS)。使用 CustomTkinter,您将在所有桌面平台(Windows、macOS、Linux)上获得一致且现代的外观。

GitHub社区也非活跃,一直保持更新,收藏数高达7.4k

安装

使用 pip 安装模块:

pip3 install customtkinter

更新现有安装:尽可能经常更新,因为这个库正在积极开发中

pip3 install customtkinter --upgrade

看一下官方的展示demo


新建一个文件,输入下面代码,运行即可看到上面展示效果

import tkinter
import tkinter.messagebox
import customtkintercustomtkinter.set_appearance_mode("System")  # Modes: "System" (standard), "Dark", "Light"
customtkinter.set_default_color_theme("blue")  # Themes: "blue" (standard), "green", "dark-blue"class App(customtkinter.CTk):def __init__(self):super().__init__()# configure windowself.title("CustomTkinter complex_example.py")self.geometry(f"{1100}x{580}")# configure grid layout (4x4)self.grid_columnconfigure(1, weight=1)self.grid_columnconfigure((2, 3), weight=0)self.grid_rowconfigure((0, 1, 2), weight=1)# create sidebar frame with widgetsself.sidebar_frame = customtkinter.CTkFrame(self, width=140, corner_radius=0)self.sidebar_frame.grid(row=0, column=0, rowspan=4, sticky="nsew")self.sidebar_frame.grid_rowconfigure(4, weight=1)self.logo_label = customtkinter.CTkLabel(self.sidebar_frame, text="CustomTkinter", font=customtkinter.CTkFont(size=20, weight="bold"))self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10))self.sidebar_button_1 = customtkinter.CTkButton(self.sidebar_frame, command=self.sidebar_button_event)self.sidebar_button_1.grid(row=1, column=0, padx=20, pady=10)self.sidebar_button_2 = customtkinter.CTkButton(self.sidebar_frame, command=self.sidebar_button_event)self.sidebar_button_2.grid(row=2, column=0, padx=20, pady=10)self.sidebar_button_3 = customtkinter.CTkButton(self.sidebar_frame, command=self.sidebar_button_event)self.sidebar_button_3.grid(row=3, column=0, padx=20, pady=10)self.appearance_mode_label = customtkinter.CTkLabel(self.sidebar_frame, text="Appearance Mode:", anchor="w")self.appearance_mode_label.grid(row=5, column=0, padx=20, pady=(10, 0))self.appearance_mode_optionemenu = customtkinter.CTkOptionMenu(self.sidebar_frame, values=["Light", "Dark", "System"],command=self.change_appearance_mode_event)self.appearance_mode_optionemenu.grid(row=6, column=0, padx=20, pady=(10, 10))self.scaling_label = customtkinter.CTkLabel(self.sidebar_frame, text="UI Scaling:", anchor="w")self.scaling_label.grid(row=7, column=0, padx=20, pady=(10, 0))self.scaling_optionemenu = customtkinter.CTkOptionMenu(self.sidebar_frame, values=["80%", "90%", "100%", "110%", "120%"],command=self.change_scaling_event)self.scaling_optionemenu.grid(row=8, column=0, padx=20, pady=(10, 20))# create main entry and buttonself.entry = customtkinter.CTkEntry(self, placeholder_text="CTkEntry")self.entry.grid(row=3, column=1, columnspan=2, padx=(20, 0), pady=(20, 20), sticky="nsew")self.main_button_1 = customtkinter.CTkButton(master=self, fg_color="transparent", border_width=2, text_color=("gray10", "#DCE4EE"))self.main_button_1.grid(row=3, column=3, padx=(20, 20), pady=(20, 20), sticky="nsew")# create textboxself.textbox = customtkinter.CTkTextbox(self, width=250)self.textbox.grid(row=0, column=1, padx=(20, 0), pady=(20, 0), sticky="nsew")# create tabviewself.tabview = customtkinter.CTkTabview(self, width=250)self.tabview.grid(row=0, column=2, padx=(20, 0), pady=(20, 0), sticky="nsew")self.tabview.add("CTkTabview")self.tabview.add("Tab 2")self.tabview.add("Tab 3")self.tabview.tab("CTkTabview").grid_columnconfigure(0, weight=1)  # configure grid of individual tabsself.tabview.tab("Tab 2").grid_columnconfigure(0, weight=1)self.optionmenu_1 = customtkinter.CTkOptionMenu(self.tabview.tab("CTkTabview"), dynamic_resizing=False,values=["Value 1", "Value 2", "Value Long Long Long"])self.optionmenu_1.grid(row=0, column=0, padx=20, pady=(20, 10))self.combobox_1 = customtkinter.CTkComboBox(self.tabview.tab("CTkTabview"),values=["Value 1", "Value 2", "Value Long....."])self.combobox_1.grid(row=1, column=0, padx=20, pady=(10, 10))self.string_input_button = customtkinter.CTkButton(self.tabview.tab("CTkTabview"), text="Open CTkInputDialog",command=self.open_input_dialog_event)self.string_input_button.grid(row=2, column=0, padx=20, pady=(10, 10))self.label_tab_2 = customtkinter.CTkLabel(self.tabview.tab("Tab 2"), text="CTkLabel on Tab 2")self.label_tab_2.grid(row=0, column=0, padx=20, pady=20)# create radiobutton frameself.radiobutton_frame = customtkinter.CTkFrame(self)self.radiobutton_frame.grid(row=0, column=3, padx=(20, 20), pady=(20, 0), sticky="nsew")self.radio_var = tkinter.IntVar(value=0)self.label_radio_group = customtkinter.CTkLabel(master=self.radiobutton_frame, text="CTkRadioButton Group:")self.label_radio_group.grid(row=0, column=2, columnspan=1, padx=10, pady=10, sticky="")self.radio_button_1 = customtkinter.CTkRadioButton(master=self.radiobutton_frame, variable=self.radio_var, value=0)self.radio_button_1.grid(row=1, column=2, pady=10, padx=20, sticky="n")self.radio_button_2 = customtkinter.CTkRadioButton(master=self.radiobutton_frame, variable=self.radio_var, value=1)self.radio_button_2.grid(row=2, column=2, pady=10, padx=20, sticky="n")self.radio_button_3 = customtkinter.CTkRadioButton(master=self.radiobutton_frame, variable=self.radio_var, value=2)self.radio_button_3.grid(row=3, column=2, pady=10, padx=20, sticky="n")# create slider and progressbar frameself.slider_progressbar_frame = customtkinter.CTkFrame(self, fg_color="transparent")self.slider_progressbar_frame.grid(row=1, column=1, padx=(20, 0), pady=(20, 0), sticky="nsew")self.slider_progressbar_frame.grid_columnconfigure(0, weight=1)self.slider_progressbar_frame.grid_rowconfigure(4, weight=1)self.seg_button_1 = customtkinter.CTkSegmentedButton(self.slider_progressbar_frame)self.seg_button_1.grid(row=0, column=0, padx=(20, 10), pady=(10, 10), sticky="ew")self.progressbar_1 = customtkinter.CTkProgressBar(self.slider_progressbar_frame)self.progressbar_1.grid(row=1, column=0, padx=(20, 10), pady=(10, 10), sticky="ew")self.progressbar_2 = customtkinter.CTkProgressBar(self.slider_progressbar_frame)self.progressbar_2.grid(row=2, column=0, padx=(20, 10), pady=(10, 10), sticky="ew")self.slider_1 = customtkinter.CTkSlider(self.slider_progressbar_frame, from_=0, to=1, number_of_steps=4)self.slider_1.grid(row=3, column=0, padx=(20, 10), pady=(10, 10), sticky="ew")self.slider_2 = customtkinter.CTkSlider(self.slider_progressbar_frame, orientation="vertical")self.slider_2.grid(row=0, column=1, rowspan=5, padx=(10, 10), pady=(10, 10), sticky="ns")self.progressbar_3 = customtkinter.CTkProgressBar(self.slider_progressbar_frame, orientation="vertical")self.progressbar_3.grid(row=0, column=2, rowspan=5, padx=(10, 20), pady=(10, 10), sticky="ns")# create scrollable frameself.scrollable_frame = customtkinter.CTkScrollableFrame(self, label_text="CTkScrollableFrame")self.scrollable_frame.grid(row=1, column=2, padx=(20, 0), pady=(20, 0), sticky="nsew")self.scrollable_frame.grid_columnconfigure(0, weight=1)self.scrollable_frame_switches = []for i in range(100):switch = customtkinter.CTkSwitch(master=self.scrollable_frame, text=f"CTkSwitch {i}")switch.grid(row=i, column=0, padx=10, pady=(0, 20))self.scrollable_frame_switches.append(switch)# create checkbox and switch frameself.checkbox_slider_frame = customtkinter.CTkFrame(self)self.checkbox_slider_frame.grid(row=1, column=3, padx=(20, 20), pady=(20, 0), sticky="nsew")self.checkbox_1 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame)self.checkbox_1.grid(row=1, column=0, pady=(20, 0), padx=20, sticky="n")self.checkbox_2 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame)self.checkbox_2.grid(row=2, column=0, pady=(20, 0), padx=20, sticky="n")self.checkbox_3 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame)self.checkbox_3.grid(row=3, column=0, pady=20, padx=20, sticky="n")# set default valuesself.sidebar_button_3.configure(state="disabled", text="Disabled CTkButton")self.checkbox_3.configure(state="disabled")self.checkbox_1.select()self.scrollable_frame_switches[0].select()self.scrollable_frame_switches[4].select()self.radio_button_3.configure(state="disabled")self.appearance_mode_optionemenu.set("Dark")self.scaling_optionemenu.set("100%")self.optionmenu_1.set("CTkOptionmenu")self.combobox_1.set("CTkComboBox")self.slider_1.configure(command=self.progressbar_2.set)self.slider_2.configure(command=self.progressbar_3.set)self.progressbar_1.configure(mode="indeterminnate")self.progressbar_1.start()self.textbox.insert("0.0", "CTkTextbox\n\n" + "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.\n\n" * 20)self.seg_button_1.configure(values=["CTkSegmentedButton", "Value 2", "Value 3"])self.seg_button_1.set("Value 2")def open_input_dialog_event(self):dialog = customtkinter.CTkInputDialog(text="Type in a number:", title="CTkInputDialog")print("CTkInputDialog:", dialog.get_input())def change_appearance_mode_event(self, new_appearance_mode: str):customtkinter.set_appearance_mode(new_appearance_mode)def change_scaling_event(self, new_scaling: str):new_scaling_float = int(new_scaling.replace("%", "")) / 100customtkinter.set_widget_scaling(new_scaling_float)def sidebar_button_event(self):print("sidebar_button click")if __name__ == "__main__":app = App()app.mainloop()

CustomTkinter:【一】介绍:python最新GUI框架:CustomTkinter -- 它提供了新的、现代的和完全可定制的小部件相关推荐

  1. Python的GUI框架PySide

    PySide学习笔记 PySide安装 Python自带了GUI模块Tkinter,只是界面风格有些老旧. Python的Qt有PyQt和PySide吧.PyQt 是商业及 GPL 的版权, 而 Py ...

  2. python的GUI框架tkinter,实现程序员的流氓式表白逻辑

    导入依赖 '''导入依赖''' import tkinter as tk import tkinter.messagebox as msg 创建并隐藏根窗口 '''创建并隐藏根窗口''' root_w ...

  3. python协程异步原理_简单介绍Python的Tornado框架中的协程异步实现原理

    Tornado 4.0 已经发布了很长一段时间了, 新版本广泛的应用了协程(Future)特性. 我们目前已经将 Tornado 升级到最新版本, 而且也大量的使用协程特性. 很长时间没有更新博客, ...

  4. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline

    django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发 ...

  5. djpython教程_简单介绍Python的Django框架的dj-scaffold项目

    由于Django没有象rails一样指定项目的目录结构规范,很多人都对django项目的目录结构要如何组织而感到困惑.为此我又新创建了一个开源项目dj-scaffold(django的脚手架).这个项 ...

  6. python的gui库哪个好_常用的13 个Python开发者必备的Python GUI库

    [Python](http://www.blog2019.net/tag/Python?tagId=4)是一种高级编程语言,它用于通用编程,由Guido van Rossum 在1991年首次发布.P ...

  7. python cgi库_《Python 数据库 GUI CGI编程》

    1. 上次写在前面,我们介绍了一篇关于开始使用Python.今天我们将介绍Python数据库,GUI, CGI编程和Python和Python的区别.2.连接到数据库标准Python数据库接口是Pyt ...

  8. Python全栈工程师-第2周(新)-韦玮-专题视频课程

    Python全栈工程师-第2周(新)-256人已学习 课程介绍         Python全栈工程师-第2周(新),爬虫部分 课程收益     Python全栈工程师 讲师介绍     韦玮 更多讲 ...

  9. Python全栈工程师-第3周(新)-韦玮-专题视频课程

    Python全栈工程师-第3周(新)-190人已学习 课程介绍         Python全栈工程师-第3周(新) 课程收益     Python全栈工程师 讲师介绍     韦玮 更多讲师课程   ...

最新文章

  1. Python高级特性:切片、迭代、列表生成式、生成器与迭代器
  2. java chunked 解码_模拟http请求 带 chunked解析办法一
  3. net类库中发送电子邮件的方法总结
  4. paypal创建订单后怎么获得id_PayPal开放加密数字货币买卖 2021年将支持2600万家商户购物...
  5. QQ for Linux 复活,微信 for Linux 还远吗?
  6. 微信退款参数格式错误
  7. 德鲁伊 oltp oltp_深入研究内存中OLTP表的哈希索引
  8. 通道的分离与合并,ROI,
  9. 计算机硬盘合并怎么弄,如何将分区的硬盘合并为一个磁盘?
  10. lol7月9日服务器维护,英雄联盟7月9日更新维护到几点结束_lol7月9日10.14版本更新维护结束时间介绍_咖绿茵手游站...
  11. Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.Lon
  12. RCLAMP0524P超低电容TVS二极管阵列,DFN-10L封装
  13. 爱奇艺大数据实时分析平台的建设与实践
  14. 6.5编程实例-立方体透视投影
  15. bzoj-1233 [Usaco2009Open]干草堆tower
  16. iOS 图片裁剪(用户头像裁剪)
  17. 未来已来!阿里小蜜AI技术揭秘
  18. Markdown图标
  19. 日语自学资料-N5(免费下载)
  20. 解决Win2003 IIS不能下载rmvb

热门文章

  1. excel流程图连接线锁定_Excel这样的流程图你会吗 ?
  2. 金立m5android经常自启,手机体验更好 金立M5迎来首次系统升级
  3. 解决springboot中出现Access denied for user ‘‘@‘localhost‘ (using password: NO)问题
  4. 撕心裂肺的伤感QQ日志_只是忽然,很想你....
  5. 二、八、十、十六 进制转换(B、O\Q、D、H)
  6. 公司要倒闭遣散员工要如何处理
  7. 深度讲解Linux企业级集群实现方案
  8. PHP内容缓存输出 PEAR cache
  9. 二十八、bugku 闪电十六鞭
  10. 总能找到女人可夸之处