【问题标题】:Can tkinter styles be extended or combined?tkinter 样式可以扩展或组合吗?
【发布时间】:2019-10-22 06:24:39
【问题描述】:

假设我有一个按钮样式。

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'])

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    问题tkinter.Style 是扩展还是合并?

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

    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)
    

    用法

    注意:要仅更改字体大小,请使用Nonefont=(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

    【讨论】:

    • 谢谢!我没有意识到一个样式对象就足够了。
    猜你喜欢
    • 2019-04-02
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多