TLC/TK Adv学习笔记1 - Py版本+美化

news/2024/9/21 16:24:16 标签: 笔记, GUI, python

Python下重点

tkinter.ttk 模块自 Tk 8.5 开始引入,它提供了对 Tk 风格的部件集的访问。 它还带来了一些额外好处包括在 X11 下的反锯齿字体渲染和透明化窗口(需要有 X11 上的混合窗口管理器)。
tkinter.ttk 的基本设计思路,就是尽可能地把控件的行为代码与实现其外观的代码分离开来。

所以,TTK可以更好地自定义theme来美化UI

使用方法

from tkinter import *
from tkinter.ttk import *

# from tkinter import ttk # 同时保留两种控件,不推荐

这段代码会让以下几个 tkinter.ttk 控件(Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale 和 Scrollbar)自动替换掉 Tk 的对应控件。

使用新控件的直接好处,是拥有更好的跨平台的外观,但新旧控件并不完全兼容

主要区别在于,Ttk 组件不再包含“fg”、“bg”等与样式相关的属性 。
而是用 ttk.Style 类来定义更美观的样式效果。

ttk 中有 18 种部件 ,其中 12 种在 tkinter 中已包含了:

  • Button
  • Checkbutton
  • Entry
  • Frame
  • Label
  • LabelFrame
  • Menubutton
  • PanedWindow
  • Radiobutton
  • Scale
  • Scrollbar
  • Spinbox

另有 6 种是新增的:

  • Combobox
  • Notebook
  • Progressbar
  • Separator
  • Sizegrip
  • Treeview

这些控件全都是 Widget 的子类。

Tk 代码:

l1 = tkinter.Label(text="Test", fg="black", bg="white")
l2 = tkinter.Label(text="Test", fg="black", bg="white")

Ttk 代码:

style = ttk.Style()
style.configure("BW.TLabel", foreground="black", background="white")

l1 = ttk.Label(text="Test", style="BW.TLabel")
l2 = ttk.Label(text="Test", style="BW.TLabel")

TTK 通用属性

通用属性:

  • class : 指定窗口类。若要从参数库中查找窗口的其他属性,或确认窗口的默认绑定标签,或选择控件的默认布局和样式,会用到 class 属性。该属性只读,且只能在创建窗口时指定。
  • cursor : 指定控件使用的鼠标光标。若设为空字符串(默认值),则会继承父控件的光标。
  • takefocus : 决定了窗口是否可用键盘获得焦点。返回 0 、1 或空字符串。若返回 0,则表示在用键盘遍历时应该跳过该窗口。如果为 1,则表示只要窗口可见即应接收输入焦点。而空字符串则表示由遍历代码决定窗口是否接收焦点。
  • style : 可用于指定自定义控件样式。
  • state : 可以设为“normal”或“disabled”,以便控制“禁用”状态标志位。

可滚动控件的属性:

  • xscrollcommand : 水平滚动条通讯, 通常该属性由一些滚动条的 Scrollbar.set() 方法组成。当窗口中的可见内容发生变化时,将会刷新滚动条的状态。
  • yscrollcommand : 垂直滚动条通讯

标签、按钮和类似按钮的控件支持以下属性:

  • text : 指定显示在控件内的文本
  • textvariable : 指定一个变量名,其值将用于设置 text 属性。
  • underline : 设置文本字符串中带下划线字符的索引(基于0)。下划线字符用于激活快捷键。
  • image : 指定一个用于显示的图片。这是一个由1个或多个元素组成的列表。第一个元素是默认的图片名称。列表的其余部分是由 Style.map() 定义的“状态/值对”的序列,指定控件在某状态或状态组合时要采用的图片。列表中的所有图片应具备相同的尺寸。
  • compound : 指定同时存在 text 和 image 属性时,应如何显示文本和对应的图片。text/image/none/top/bottom/left/right
  • width : 如果值大于零,指定文本标签留下多少空间,单位是字符数;如果值小于零,则指定最小宽度。如果等于零或未指定,则使用文本标签本身的宽度。

控件状态

所谓的控件状态,就是一串状态名称的组合,可在某个名称前加上感叹号,表示该状态位是关闭的。

  • active : 鼠标光标经过控件并按下鼠标按钮,将引发动作。
  • disabled : 控件处于禁用状态,而由程序控制。
  • focus : 控件接受键盘焦点。
  • pressed : 控件已被按下。
  • selected : 勾选或单选框之类的控件,表示启用、选中状态。
  • background : Windows 和 Mac 系统的窗口具有“激活”或后台的概念。后台窗口的控件会设置 foreground 参数,而前台窗口的控件则会清除此状态。
  • readonly : 控件不允许用户修改。
  • alternate : 控件的备选显式格式。
  • invalid : 控件的值是无效的

继承 Widget的方法

除了以下方法之外,ttk.Widget 还支持 tkinter.Widget.cget()tkinter.Widget.configure() 方法。

  • identify(x, y) : 返回位于 x y 的控件名称,如果该坐标点不属于任何控件,则返回空字符串。
  • instate(statespec, callback=None, *args, **kw) : 检测控件的状态。如果没有设置回调函数,那么当控件状态符合 statespec 时返回 True,否则返回 False。如果指定了回调函数,那么当控件状态匹配 statespec 时将会调用回调函数,且会带上后面的参数。
  • state(statespec=None) : 修改或查询部件状态。 如果指定了 statespec,则会用它来设置部件状态并返回一个新的 statespec 来指明哪些旗标做过改动。 如果未指定 statespec,则返回当前启用的状态旗标。

TTK 样式

class tkinter.ttk.Style

  • configure: 查询或设置 style 的默认属性值。
  • map : 查询或设置 style 的指定属性的动态值。
  • lookup: 返回 style 中的 option 属性值。
  • layout: 按照 style 定义控件布局。如果省略了 layoutspec,则返回该样式的布局属性。
  • element_create: 使用当前theme创建新的element
  • theme_create: 新建主题
  • theme_settings: 修改主题
  • theme_use: 使用主题

ttk 的每种控件都赋有一个样式,指定了控件内的元素及其排列方式,以及元素属性的动态和默认设置。默认情况下,样式名与控件的类名相同,但可能会被控件的 style 属性覆盖。

如果不知道控件的类名,可用 Misc.winfo_class() 方法获取(somewidget.winfo_class())。

修改原来的class

from tkinter import ttk
import tkinter

root = tkinter.Tk()

ttk.Style().configure("TButton", padding=6, relief="flat",
   background="#ccc")

btn = ttk.Button(text="Sample")
btn.pack()

root.mainloop()

新增一个class

import tkinter
from tkinter import ttk

root = tkinter.Tk()

style = ttk.Style()
style.map("C.TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', '!disabled', 'black'), ('active', 'white')]
    )

colored_btn = ttk.Button(text="Test", style="C.TButton").pack()

root.mainloop()

创建主题

from tkinter import ttk
import tkinter

root = tkinter.Tk()

style = ttk.Style()
style.theme_settings("default", {
   "TCombobox": {
       "configure": {"padding": 5},
       "map": {
           "background": [("active", "green2"),
                          ("!disabled", "green4")],
           "fieldbackground": [("!disabled", "green3")],
           "foreground": [("focus", "OliveDrab1"),
                          ("!disabled", "OliveDrab2")]
       }
   }
})

combo = ttk.Combobox().pack()

root.mainloop()

简化+美化 ttk

https://ttkbootstrap.readthedocs.io/
在构建 ttkbootstrap 应用程序时,可以使用两种方法。如果您使用过tkinter和ttk,则第一个是熟悉的。第二个使用新的Window类来简化整个过程。

安装 ttkbootstrap: python -m pip install ttkbootstrap

demo

import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *

root = tk.Tk()

b1 = ttk.Button(root, text="Button 1", bootstyle=SUCCESS)
b1.pack(side=LEFT, padx=5, pady=10)

b2 = ttk.Button(root, text="Button 2", bootstyle=(INFO, OUTLINE))
b2.pack(side=LEFT, padx=5, pady=10)

root.mainloop()

demo

默认主题是litera,但您可以通过单独使用Style对象或通过Window类使用任何内置主题来启动应用程序。
root = ttk.Window(themename="darkly")


http://www.niftyadmin.cn/n/5669049.html

相关文章

【2024华为杯数学建模竞赛】E题 解题思路 | 视频特征提取

这高速公路应急车道紧急启用模型 问题 1解题思路解题思路 问题 2解题思路 问题 3解题思路 问题 1 某路段(长度约5000m,行车道2应急车道1)上有四个视频观测点(见示意图1)。请基于该路段四个视频数据解决如下问题&#x…

《探索云原生与相关技术》

在当今的科技领域中,云原生(Cloud Native)已经成为了一个热门的话题。它代表着一种构建和运行应用程序的全新方式。 云原生的概念 云原生是一套技术体系和方法论,旨在充分利用云计算的优势来构建更具弹性、可扩展性和高效性的应…

Spring Tx事务 总结

1.简介 Spring Tx事务是对Spring AOP的再次封装,事务主要使用场景是处理数据库提交数据时&#xff0c;异常处理中需要回滚的情况&#xff0c;通过Spring Tx事务可以简化该操作。 2.代码 如果要使用事务&#xff0c;需要在pom.xml中加入以下依赖项: <dependency><…

代码随想录算法训练营Day9

232.用栈实现队列 Collection——List——Vector类——Stack类 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackInnew Stack();stackOutnew Stack();} public void push(int x) {stackIn.push(x);}public int pop() {no…

全网首创开源:基于视频、物联、AI服务一体化解决方案

BasicLab-AIoT 引领创新智慧视觉物联网云平台&#xff0c;无界融合物联网技术、流媒体摄像头实时传输与AI人工智能解析&#xff0c;开启智能监控与数据分析新纪元。 我们不仅实现了设备的互联互通&#xff0c;更通过深度整合高清流媒体视频流与前沿AI算法&#xff0c;为摄像头…

解决VSCode中Eslint插件无法自动折行的问题

问题描述 在.eslintrc.cjs 文件中写入了如下配置 代码过长时会出现黄色波浪线报错 但Ctrls保存却不能自动折行 具体表现是短时间内出现两次格式化&#xff0c;第一次格式化会将长代码自动拆行成短代码&#xff0c;但第二次格式化又将短代码变回了长代码&#xff08;按Ctrlz可…

【Linux系统编程】第二十弹---进程优先级 命令行参数 环境变量

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程优先级 2.1、什么是优先级 2.2、优先级的描述 2.3、优先级与权限的关系 2.4、为什么要有优先级 2.5、Linux优先级的…

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型2 处理连接字符串

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…