小部件是否可以有标准样式?

jus*_*neS 2 python user-interface tkinter tkinter.style

我希望我的 gui 中的所有按钮都具有相同的样式。现在我手动写入我想要的属性,但它占用了太多空间。另外,如果我想改变样式,我必须去每一个按钮。是否可以定义一次样式,然后在制作所有按钮时引用它?类似于以下内容:

basic_style = 
     {'background': 'blue',
     'foreground':'white', 
     'font':'Helvetica 8 bold'} 

self.btn = tk.Button(text = 'Hello', style = basic_style)
Run Code Online (Sandbox Code Playgroud)

我知道可以做这样的事情:

self.btn['text'] = 'Bye'
Run Code Online (Sandbox Code Playgroud)

但这仍然对我没有多大帮助。

Bry*_*ley 5

我至少可以想到四种方法来做到这一点:使用选项数据库、传递选项字典、使用 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()
Run Code Online (Sandbox Code Playgroud)

注意:您必须在创建根窗口之后但在创建您希望受此影响的任何小部件之前执行此操作。

如何使用选项数据库可能有点复杂,但如果您愿意花时间去做,它确实可以计算整个主题。最好的——尽管最古老——的描述之一直接来自 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()
Run Code Online (Sandbox Code Playgroud)

我不知道这是否在任何地方都有记录,但是您可以通过查看实际的 tkinter 代码看到它受到支持。

使用 ttk 小部件

“ttk”代表“主题传统知识”。整个想法是通过应用主题的能力重新实现 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()
Run Code Online (Sandbox Code Playgroud)

不幸的是,几乎没有关于如何配置主题的好的文档。这有点令人困惑和不标准,但如果您愿意付出努力,结果可以非常完美。

学习如何创建主题的最佳资源位于 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()
Run Code Online (Sandbox Code Playgroud)