【问题标题】:Is it possible to have a standard style for a widget?小部件是否可以有标准样式?
【发布时间】:2019-02-12 02:10:02
【问题描述】:

我希望我的 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。它有一个样式系统,可以让您控制 ttk 小部件的基本样式。

标签: python user-interface tkinter tkinter.style


【解决方案1】:

我至少可以想到四种方法:使用选项数据库、传递选项字典、使用 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()

【讨论】:

    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多