修复ttk覆盖tkinter标签和按钮字体/样式

时间:2016-09-29 14:28:15

标签: python-3.x tkinter ttk

基于effbot.org's example,以下代码将设置默认样式:

from tkinter import *
#from tkinter.ttk import *

root = Tk()

root.option_add("*Font", "courier")
root.option_add("*Label.Font", "helvetica 20 bold")
root.option_add("*Background", "brown")
root.config(background="light blue")

Label(root, text="lbl").pack()
Button(root, text="bttn").pack()
Message(root, text="msg").pack()

root.mainloop()

看起来像这样:

correct look

但是,如果取消注释第二行,结果将如下:

wrong look

显然,tkinter.ttk会使用忽略Label的对象覆盖Buttonroot.option_add()的字体样式。

我知道Treeview只需要ttk,我只需将第二行更改为from tkinter.ttk import Treeview即可避免此问题。但是,控制局势而不是避免局势是有用的。

如何在Label之后更改Buttonfrom tkinter.ttk import *字体和样式?

2 个答案:

答案 0 :(得分:1)

  

显然,tkinter.ttk会覆盖Label和Button的字体样式   使用忽略root.option_add()的对象。

导入不会覆盖样式,它会覆盖小部件。当您执行Label(...)Button(...)时,您将获得ttk小部件而不是tk小部件,因为您最后导入了该库。 ttk小部件不会尊重与tk小部件相同的所有选项。

如果要更改ttk小部件的字体和样式,必须使用ttk样式机制。有关详细信息,请参阅Styles and Themes上的tkdocs.com

这是您不应该使用通配符导入的原因之一 - 这使您很难准确理解您正在使用或打算使用哪种类型的小部件,并且无法在两种类型中使用相同的申请。

导入tkinter和tk的最佳方法是导入模块,并使用模块名称作为前缀。我建议导入tkinter"作为tk"所以前缀很短:

# python 2.x
import Tkinter as tk
import ttk

# python 3.x
import tkinter as tk
from tkinter import ttk

然后您可以使用这样的tk小部件:

tk.Button(...)
tk.Label(...)

和ttk小部件是这样的:

ttk.Button(...)
ttk.Label(...)
ttk.Treeview(...)

答案 1 :(得分:0)

相反, import tkinter as tk, 并以这种方式使用它: tk.Label等。