是否可以为小部件设置标准样式?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以为小部件设置标准样式?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

但这对我来说仍然没有帮助。

答案

我至少有四种方法可以做到这一点:使用选项数据库,传递选项字典,使用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文档描述了如何做到这一点(参见Mapping basic tk into 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的Styles and Themes部分

创建自定义类

最后,第四个选项是创建自定义类。如果没有提供,您的类可以继承内置类和强制选项。

例:

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()
另一答案

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

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

以上是关于是否可以为小部件设置标准样式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中为小部件设置不高度?

将 onClickListener 设置为小部件中的按钮 [重复]

在 QGraphicsScene 上为小部件设置系统背景的背景颜色

是否可以为跨域 iframe 的内容设置样式?

Flutter:在从小部件树中删除时或在其生命周期结束时为小部件设置动画?

在页脚区域中为小部件添加第四列