2

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

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

self.btn = tk.Button(text = 'Hello', style = basic_style)

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

self.btn['text'] = 'Bye'

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

4

2 回答 2

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()

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

如何使用选项数据库可能有点复杂,但如果您愿意花时间去做,它确实可以计算整个主题。最好的(尽管是最古老的)描述之一直接来自 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()
于 2018-09-06T19:29:00.373 回答
2

是的,这比你想象的还要容易。只需使用字典解包:

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

self.btn = tk.Button(text = 'Hello', **basic_style)

另一个流行的选择是创建一个具有您想要的样式的子类,也许还有其他功能,例如工具提示或依赖于值或其他任何内容的样式。

class Justine(tk.Button):
    def __init__(self, master=None, **kwargs):
        tk.Button.__init__(self, master, 
            background = 'blue',
            foreground = 'white', 
            font = 'Helvetica 8 bold',
            **kwargs)

self.btn = Justine(text = 'Hello')
于 2018-09-06T19:18:26.933 回答