如何让ttk使用OS主题?

How to make ttk use OS theme?

我是 运行 python kubuntu 3.7,工作区主题 'Breeze Dark'。我的应用程序中的 tk 小部件正确采用了 OS 的主题,但 ttk 小部件使用了其他东西。

有没有办法让我的 ttk 小部件使用 OS 的主题?

import tkinter as tk
from tkinter import ttk


class App:

    def __init__(self, master):
        master.title("ttk vs tk widget example")
        # tk example gui
        tk_frame = tk.Frame(master)
        tk_frame.pack()

        self.tk_label = tk.Label(tk_frame, text="tk label:")
        self.var1 = tk.StringVar(value="tk entry")
        self.tk_entry = tk.Entry(tk_frame, textvariable=self.var1)
        self.tk_quit_button = tk.Button(tk_frame,
                                        text="Quit", width=20,
                                        command=tk_frame.quit)
        self.tk_button = tk.Button(tk_frame,
                                   text="tk button", width=20)
        self.tk_label.grid(row=0, column=0)
        self.tk_entry.grid(row=0, column=1)
        self.tk_button.grid(row=1, column=0, sticky='e')
        self.tk_quit_button.grid(row=1, column=1, sticky='e')

        separator = tk.Frame(height=2, bd=1, relief=tk.SUNKEN)
        separator.pack(fill=tk.X, padx=5, pady=15)

        # ttk example gui
        ttk_frame = ttk.Frame(master)
        ttk_frame.pack()

        self.ttk_label = ttk.Label(ttk_frame, text="ttk label:")
        self.var2 = tk.StringVar(value="ttk entry")
        self.ttk_entry = ttk.Entry(ttk_frame, textvariable=self.var2)
        self.ttk_quit_button = ttk.Button(ttk_frame,
                                          text="Quit", width=20,
                                          command=ttk_frame.quit)
        self.ttk_button = ttk.Button(ttk_frame,
                                     text="ttk button", width=20)
        self.ttk_label.grid(row=0, column=0)
        self.ttk_entry.grid(row=0, column=1)
        self.ttk_button.grid(row=1, column=0, sticky='e')
        self.ttk_quit_button.grid(row=1, column=1, sticky='e')


root = tk.Tk()
app = App(root)
root.mainloop()

ttk 与 tk 小部件的示例:

编辑: 所以这不是真正的修复,但我可以通过以下方式设置正确的颜色:

tk_bg = self.tk_label.cget("background")
tk_fg = self.tk_label.cget("foreground")

self.ttk_label = ttk.Label(ttk_frame, text="ttk label:", 
                           background=tk_bg, foreground=tk_fg)

我正在使用 XFCE 桌面环境,甚至 tk 小部件也不适应我使用的主题,这并不奇怪,因为 XFCE 基于 GTK GUI 工具包,因此 GTK 主题没有理由影响 Tk主题。

因此您需要手动更改 GUI 的主题并 设置 ttk 小部件颜色的唯一方法是通过 ttk.Style:

tk_bg = self.tk_label.cget("background")
tk_fg = self.tk_label.cget("foreground")
tk_entrybg = self.tk_entry.cget("background")

style = ttk.Style(master)
style.configure('TFrame', background=tk_bg)
style.configure('TLabel', background=tk_bg, foreground=tk_fg)
style.configure('TButton', background=tk_bg, foreground=tk_fg)
style.configure('TEntry', background=tk_bg, fieldbackground=tk_entrybg, foreground=tk_fg)

所有 ttk 小部件都与一个样式相关联(通常 'T + widget name',除了 Treeview 没有额外的 'T')。这些样式由您使用的 ttk 主题定义。您可以使用 style.theme_use(<theme name>) 更改主题,您可以使用 style.theme_names().

获取可用的主题