我至少可以想到四种方法来做到这一点:使用选项数据库、传递选项字典、使用 ttk 和创建自定义类。
使用选项数据库
有几种方法可以实现您想要的。最初对此的支持是基于 X11 窗口系统选项数据库。每个小部件都有一个类,每个类都可以设置它的选项。
您可以通过option_set
根窗口(以及option_readfile
)的方法、指定模式和默认值来执行此操作。
例子:
import tkinter as tk
root = tk.Tk()
root.option_add("*Font", "Helvetica 8 bold")
root.option_add("*Background", "blue")
root.option_add("*Foreground", "white")
button1 = tk.Button(root, text="Hello", command=lambda: print("Hello"))
button2 = tk.Button(root, text="World", command=lambda: print("world"))
button1.pack()
button2.pack()
root.mainloop()
注意:您必须在创建根窗口之后但在创建您希望受此影响的任何小部件之前执行此操作。
如何使用选项数据库可能有点复杂,但如果您愿意花时间去做,它确实可以计算整个主题。最好的(尽管是最古老的)描述之一直接来自 tcl/tk 的核心开发人员之一:http ://www.cs.man.ac.uk/~fellowsd/tcl/option-tutorial.html 。这需要一些心理操练才能将 tcl/tk 代码转换为 python/tkinter,但 python 文档描述了如何做到这一点(请参阅将基本 tk 映射到 tkinter
使用字典。
您确实可以传入一个选项字典,但有几个小警告。该字典必须是父级之后的第一个参数,并且必须在任何其他关键字参数之前。
例子:
import tkinter as tk
basic_style = {'background': 'blue', 'foreground': 'white', 'font': 'Helvetica 8 bold'}
root = tk.Tk()
button1 = tk.Button(root, basic_style, text="Hello", command=lambda: print("Hello"))
button2 = tk.Button(root, basic_style, text="World", command=lambda: print("world"))
button1.pack()
button2.pack()
root.mainloop()
如果这在任何地方都有记录,我不知道,但是您可以通过查看实际的 tkinter 代码看到它受到支持。
使用 ttk 小部件
“ttk”代表“主题 tk”。整个想法是通过应用主题的能力重新实现 tk。ttk 有大部分与 tkinter 相同的小部件,加上一些它没有的小部件(例如,树视图小部件)。
例子:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
style = ttk.Style()
style.configure('Custom.TButton',
background="blue", foreground="white",
font='Helvetica 8 bold')
button1 = ttk.Button(root, text='Hello', style='Custom.TButton')
button2 = ttk.Button(root, text='Hello', style='Custom.TButton')
button1.pack()
button2.pack()
root.mainloop()
不幸的是,几乎没有关于如何配置主题的好的文档。这有点令人困惑和不标准,但如果你愿意付出努力,结果会非常完美。
学习如何创建主题的最佳资源位于 tkdocs.com 的样式和主题部分
创建自定义类
最后,第四个选项是创建自定义类。如果未提供,您的类可以从内置类继承并强制设置选项。
例子:
import tkinter as tk
class CustomButton(tk.Button):
def __init__(self, *args, **kwargs):
kwargs.setdefault("background", "blue")
kwargs.setdefault("foreground", "white")
kwargs.setdefault("font", "Helvetica 8 bold")
super().__init__(*args, **kwargs)
root = tk.Tk()
button1 = CustomButton(root, text="Hello", command=lambda: print("Hello"))
button2 = CustomButton(root, text="World", command=lambda: print("world"))
button1.pack()
button2.pack()
root.mainloop()