解决在tkbootstrap下ttk组件不支持直接使用font参数/无法修改字体的问题

省流

使用Style.configure()

# 设置所有Button的font
style = ttk.Style()
# 如果已有style 如:style = ttk.Style("cyborg"),则无需重复创建style
style.configure("TButton", font=("DIN1451", 10))
# 所有的按钮组件都会使用字体DIN1451,字体大小为10

正文

栗子🌰:

test.py:

import tkinter as tk
import tkinter as ttk

win = tk.Tk()
win.geometry('1060x700')

quit_button = ttk.Button(win, text="Exit", command=win.quit, width=5, font="DIN1451")
quit_button.pack()
win.mainloop()

test2.py:

import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *

win = tk.Tk()
win.geometry('1060x700')

quit_button = ttk.Button(win, text="Exit", command=win.quit, width=5, font="DIN1451")
quit_button.pack()
win.mainloop()

前者运行起来没有任何问题,但后者会:

Traceback (most recent call last):
  File "/data/data/com.termux/files/home/new_time/main.py", line 54, in <module>
    quit_button = ttk.Button(win, text="Exit", command=win.quit, width=5, font="DIN1451")
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/usr/lib/python3.12/site-packages/ttkbootstrap/style.py", line 5288, in __init__
    func(self, *args, **kwargs)
  File "/data/data/com.termux/files/usr/lib/python3.12/tkinter/ttk.py", line 582, in __init__
    Widget.__init__(self, master, "ttk::button", kw)
  File "/data/data/com.termux/files/usr/lib/python3.12/tkinter/ttk.py", line 527, in __init__
    tkinter.Widget.__init__(self, master, widgetname, kw=kw)
  File "/data/data/com.termux/files/usr/lib/python3.12/tkinter/__init__.py", line 2661, in __init__
    self.tk.call(
_tkinter.TclError: unknown option "-font"

说明tkbootstrap不支持使用font参数,但是,通过阅读python官方文档tkinter.ttk章节可知,我们可以尝试用style.configure()覆盖tkbootstrap的主题配置:

import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *

win = tk.Tk()
win.geometry('1060x700')

style = ttk.Style()
style.configure("TButton", font=("DIN1451", 10))

quit_button = ttk.Button(win, text="Exit", command=win.quit, width=5)
quit_button.pack()
win.mainloop()

解决!
注意,以下方法对于tkbootstrap不会奏效

style.configure("BW.TButton", font=("DIN1451", 10))
quit_button = ttk.Button(win, text="Exit", command=win.quit, width=5, bootstyle="BW.TButton")

参见:https://docs.python.org/3/library/tkinter.ttk.html

posted @ 2026-01-18 15:57  RethLibc  阅读(1)  评论(0)    收藏  举报