我希望GUI中的所有按钮都具有相同的样式。现在,我手动输入所需的属性,但它占用了很多空间。另外,如果我想更改样式,则必须转到每个按钮。我可以定义一次样式,然后在制作所有按钮时引用它吗? 类似于以下内容:
basic_style =
{'background': 'blue',
'foreground':'white',
'font':'Helvetica 8 bold'}
self.btn = tk.Button(text = 'Hello', style = basic_style)
我知道可以这样做:
self.btn['text'] = 'Bye'
但是那对我没有太大帮助。
答案 0 :(得分:4)
我至少可以想到四种方法:使用选项数据库,传递选项字典,使用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”代表“主题tk”。整个想法是通过应用主题的能力来重新实现tk。 ttk具有与tkinter大部分相同的小部件,另外还有一些它没有的小部件(例如,treeview小部件)。
示例:
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()
答案 1 :(得分: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')