gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:31:22 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com