python - tkinter 样式可以扩展或组合吗?

标签 python python-2.7 tkinter

假设我有一个按钮的样式。

import Tkinter as tk
import ttk

root = tk.Tk()
ttk.Style(root).configure('Border.TButton', borderwidth=4, relief='raised')

我想要另一种风格来扩展现有的风格。例如使用 font=('Helvetica', 24)。目前,我正在对 'Border.TButton' 样式的所有内容进行硬编码,如下所示:

ttk.Style(root).configure('BorderBigFont.TButton', borderwidth=4, relief='raised', font=('Helvetica', 24))

还有更好的办法吗?

我所要求的

伪代码(我希望它如何工作):

ttk.Style(root).configure('BorderBigFont.TButton', font=('Helvetica', 24), extends='Border.TButton')

或者,设置样式时

ttk.Style(root).configure('BigFont.TButton', font=('Helvetica', 24))
ttk.Button(root, text='foo', style=['Border.TButton', 'BigFont.TButton'])

最佳答案

Question: tkinter.Style be extended or combined?

  1. 通过继承class ttk.Style来定义您自己的class Style
  2. 重载方法 .configure(... 以实现 extend=
    1. 将每个 kwargs= 选项保存到实例属性 self._style 中。
    2. 在参数 extend= 上,在 .configure(... 之前使用 self._style[...] 中保存的选项。
    3. 转发至原始ttk.Style.configure(...

enter image description here

import tkinter as tk
import tkinter.ttk as ttk

class Style(ttk.Style):
    EXTENDS = 'extends'

    def __init__(self, parent):
        super().__init__(parent)
        self._style = {}

    def configure(self, cls, **kwargs):
        self._style.setdefault(cls, {}).update(kwargs)

        extends = self._style.get(kwargs.get(Style.EXTENDS), {})
        super().configure(cls, **extends)

        super().configure(cls, **kwargs)

Usage:

Note: To change only the font size, use None: font=(None, ....

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        buttonbox = tk.Frame(self)
        buttonbox.grid(row=0, column=0)

        style = Style(self)
        style.theme_use('clam')

        style.configure('Border.TButton', 
                        font=('Helvetica', 10), borderwidth=4, relief='raised')

        style.configure('BorderBigFont.TButton',
                        font=(None, 24),
                        extends='Border.TButton')

        style.configure('BorderRed.TButton',
                        bordercolor='red',
                        extends='Border.TButton')

        for _style in ['Border.TButton', 'BorderBigFont.TButton', 'BorderRed.TButton']:
            btn = ttk.Button(buttonbox, text=_style, style=_style)
            btn.grid()


if __name__ == "__main__":
    App().mainloop()

使用 Python 测试:3.5 - 'TclVersion':8.6 'TkVersion':8.6

关于python - tkinter 样式可以扩展或组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158208/

相关文章:

python - 计算行元素的变化

python - 如何用列值替换 Pandas 数据框中的每个值?

python_list 转数组错误

python - 如何在 Ubuntu 中分离进程

python-2.7 - 无法在虚拟环境 Python 2.7 Ubuntu 17.10 中安装软件包

python-2.7 - 使用 logger.exception() 的 Web UI 中的 Sentry 未显示异常

python - 仅在一侧向 tkinter 小部件添加填充

python - 从文本文件访问随机行 - Python

python - Tkinter Canvas 移动留下像素痕迹

python - Django 管理静态文件 404