当前位置: 首页 > news >正文

【Tkinter系列13/15】标准化外观和选项数据库

27. 标准化外观和选项数据库

可以轻松地将颜色、字体和其他选项应用于 小部件,当您创建它们时。然而

  • 如果您希望很多小部件具有相同的 背景颜色或字体,指定每个都很乏味 每次选项,以及

  • 让用户覆盖您的选择是很好的 他们最喜欢的配色方案、字体和其他选择。

因此,我们使用选项的想法 数据库以设置默认选项值。

  • 应用程序可以指定文件(例如 使用的标准文件 X 窗口系统),其中包含用户的 偏好。您可以将应用程序设置为读取 该文件并告诉 Tkinter 使用这些默认值。看 上文关于 .option_readfile() 方法的部分在 第 26 节 “通用小部件方法”部分,用于 此文件的结构。.Xdefaults

  • 您的应用程序可以直接为一个指定默认值 或使用 .option_add() 方法的多种类型的小部件;请参阅第 26 节 “通用小部件方法”下的此方法。

在我们讨论如何设置选项之前,请考虑问题 一般自定义 GUI 的外观。我们可以 为应用程序中的每个小部件命名,然后询问 用户指定每个名称的每个属性。但是这个 很麻烦,并且还会使应用程序难以 重新配置 - 如果设计器添加新微件,则 用户必须描述每个新属性的每个属性 控件。

因此,选项数据库允许程序员和用户 指定描述的一般模式 要配置的小组件。

这些模式对小部件的名称进行操作,但是 小部件使用两个并行命名 命名方案:

  1. 每个小部件都有一个类名。 默认情况下,类名与类相同 构造函数:用于按钮、框架等。但是,你 可以创建新的小部件类,通常继承 从课堂上,并给他们新的 你自己创作的名字。有关详细信息,请参见第 27.1 节 “如何命名小部件类”。'Button''Frame'Frame

  2. 您还可以为任何小部件提供一个实例 名称。小组件的默认名称为 通常是一个无意义的数字(请参见第 5.11 节 “窗口名称”)。但是,与小部件一样 类,您可以为任何小部件指定名称。请参阅的 第 27.2 节 “如何命名小部件实例”部分了解详细信息。

因此,每个应用程序中的每个小部件都有两个 名称的层次结构 - 类名层次结构和 实例名称层次结构。例如,按钮 嵌入在文本小部件中,该小部件本身嵌入在 框架将具有类层次结构。它可能还有一个实例 层次结构有点像如果你这么命名 所有实例。初始点代表根 窗;有关更多信息,请参见第 5.11 节 “窗口名称” 有关窗口路径名的信息。Frame.Text.Button.mainFrame.messageText.panicButton

选项数据库机制可以使用任一类 定义选项时的名称或实例名称,以便您可以 使选项适用于整个类(例如,所有按钮都有 蓝色背景)或特定实例(例如, 紧急按钮上有红色字母)。在我们看了如何 为了命名类和实例,在第 27.3 节 “资源规范行”中,我们将讨论选项 数据库确实有效。

27.1. 如何命名小部件类

例如,假设这是一个新的 已创建的小组件类。这可能是最好的 让新的小部件类从类继承,所以对 Tkinter 来说,它就像一个框架, 您可以排列其他小部件,例如标签, 条目和其中的按钮。JukeboxFrame

您可以通过传递名称来设置新小部件的类名 作为父级的选项 新类的构造函数中的构造函数。这是一个 定义新类的代码片段:class_

class Jukebox(tk.Frame):def __init__(self, master):'''Constructor for the Jukebox class'''tk.Frame.__init__(self, master, class_='Jukebox')self.__createWidgets()

27.2. 如何命名小部件实例

为特定小部件提供实例名称 应用程序,设置该小部件的选项 到包含名称的字符串。name

下面是实例名称的示例。假设你是 在应用程序中创建多个按钮,并且您希望 实例名称为 .对构造函数的调用可能会 看起来像这样:panicButton

  self.panic = tk.Button(self, name='panicButton', text='Panic', ...)

27.3. 资源规范行

选项文件中的每一行指定一个或 一个或多个应用程序中的更多选项,并且具有 这些格式:

app option-pattern: value
option-pattern: value

仅当名称为 应用程序匹配 ;第二种形式 设置所有应用程序的选项。app

例如,如果您的应用程序称为 xparrot,则表单的行

xparrot*background: LimeGreen

将 Xparrot 应用程序中的所有选项设置为 Lime 绿。(使用选项上的选项 启动应用程序时的命令行以设置 名称到 .)background-name'xparrot'

该部分具有以下语法:option-pattern

{{*|.}name}...option

也就是说,每个都是一个 零个或多个名称的列表,每个名称前面都有 星号或句点。该系列中的姓氏是 您正在设置的选项的名称。其余的每个人都 的名称可以是:option-pattern

  • 小部件的名称(大写),或

  • 实例的名称(小写)。

期权模式的工作方式有点复杂。 让我们从一个简单的例子开始:

*font: times 24

这一行说所有选项 应默认为 24 点倍。这称为松散绑定符号,表示此选项模式适用于任何应用程序中任何位置的任何选项。 比较此示例:font*font

*Listbox.font: lucidatypewriter 14

和之间的周期称为紧 绑定符号,这意味着这个规则 仅适用于微件的选项 在课堂上.ListboxfontfontListbox

再举一个例子,假设你的 xparrot 应用程序有 类的小部件的实例。在 为了为所有设置默认背景颜色 该类的小部件,您可以 在选项文件中放一行,如下所示:JukeboxJukebox

xparrot*Jukebox*background: PapayaWhip

和之间的松散绑定 () 符号使 规则适用于以下任何选项 . 比较此选项行:*JukeboxbackgroundbackgroundJukebox

xparrot*Jukebox.background: NavajoWhite

此规则将应用于构成小部件本身的框架,但由于 紧密绑定符号 它不适用于以下小部件 位于小部件内。JukeboxJukebox

在下一节中,我们将讨论 Tkinter 如何计算 如果存在,请准确列出要使用的选项值 适用的多个资源规范行。

27.4. 资源匹配规则

创建小部件时,未指定 某些选项和两个或多个资源的值 规格适用于该选项,最具体 一个适用。

例如,假设您的选项文件包含这两个 线:

*background: LimeGreen
*Listbox*background: FloralWhite

这两个规范都适用于小部件中的选项,但 第二个更具体,所以它会赢。backgroundListbox

通常,资源规范中的名称是 序列 N 1, N 2, N3, ..., o 其中每个 ni 是一个 类或实例名称。类名的排序自 从最高到最低级别,O 是选项的名称。

但是,当 Tkinter 创建一个小部件时,它所拥有的只是 该小组件的类名和实例名。

以下是资源的优先规则 规格:

  1. 选项的名称必须与 的 o 部分匹配。 例如,如果规则是option-pattern

    xparrot*indicatoron: 0

    这将仅匹配名为 的选项。indicatoron

  2. 紧密绑定运算符()更多 比松散绑定运算符 () 特定。例如,一行比一行更具体 为。.**Button.font*Button*font

  3. 对实例的引用比 对类的引用。例如,如果您有 按钮的实例名称为 ,规则比 的规则。panicButton*panicButton*font*Button*font

  4. 具有更多级别的规则更具体。为 示例,IS 的规则 比 的规则更具体。*Button*font*font

  5. 如果两个规则具有相同数量的级别,则名称 列表中较早的比较较晚的更具体 名字。例如,规则比规则更具体 为。xparrot*font*Button*font

http://www.lryc.cn/news/153512.html

相关文章:

  • springboot 集成dubbo
  • 基于YOLOV8模型和CCPD数据集的车牌目标检测系统(PyTorch+Pyside6+YOLOv8模型)
  • net user安全隐患
  • 深入剖析Kubernetes之资源模型和GPU 管理
  • Springboot整合HBase
  • 在不同操作系统上如何安装符号表提取工具(eu-strip)
  • 钡铼R40边缘计算网关与华为云合作,促进物联网传感器数据共享与应用
  • 图表背后的故事:数据可视化的威力与影响
  • C++ 信号处理
  • 电源模块的降额曲线
  • uni-app 之 安装uView,安装scss/sass编译
  • CSS中如何隐藏元素但保留其占位空间(display:nonevsvisibility:hidden)?
  • 【rust/egui】(八)使用panels给你的应用划分功能区块
  • QT实现任意阶贝塞尔曲线绘制
  • 【Java 基础篇】Java 数组使用详解:从零基础到数组专家
  • 基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作
  • docker_python-django_uwsgi_nginx_浏览器_网络访问映过程
  • Python爬取天气数据并进行分析与预测
  • 基础算法-递推算法-学习
  • L1-056 猜数字(Python实现) 测试点全过
  • 第 361 场 LeetCode 周赛题解
  • 07-架构2023版-centos+docker部署Canal 实现多端数据同步
  • 过滤器的应用-Filter
  • leetcode236. 二叉树的最近公共祖先(java)
  • spacy安装旧版本en_core_web_sm的解决方案
  • Qt +VTK+Cmake 编译和环境配置(第一篇 采坑)
  • 2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南宁师范大学图书馆
  • C++/C# : C#和C++的不同
  • PCL-直通滤波器原理及实验
  • 数学建模:相关性分析