假设我有一个按钮的样式。
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?
- 通过继承
class ttk.Style
来定义您自己的class Style
。 - 重载方法
.configure(...
以实现extend=
。- 将每个
kwargs=
选项保存到实例属性self._style
中。 - 在参数
extend=
上,在.configure(...
之前使用self._style[...]
中保存的选项。 - 转发至原始
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)
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/