Как заставить ттк использовать тему ОС? - PullRequest
0 голосов
/ 26 августа 2018

Я использую Python 3.7 на Kubuntu с темой Workspace «Breeze Dark». Виджеты tk в моем приложении правильно воспринимают тему ОС, но виджеты tk используют что-то другое.

Есть ли способ заставить мои виджеты ttk использовать тему ОС?

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 vs tk:

Example of ttk vs tk

EDIT: Так что это не совсем так, но я могу установить правильные цвета с помощью:

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)

1 Ответ

0 голосов
/ 28 августа 2018

Я использую рабочую среду XFCE, и даже виджеты tk не адаптируются к используемой мной теме, что неудивительно, поскольку XFCE основан на GTK GUI Toolkit, поэтому у темы GTK нет причин влиять на тему Tk.

Таким образом, вам нужно будет изменить тему графического интерфейса вручную, и единственный способ установить цвета виджетов 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 + имя виджета», за исключением Treeview, для которого нет дополнительного «T»).И эти стили определяются темой ttk, которую вы используете.Вы можете изменить тему с помощью style.theme_use(<theme name>), а доступные темы - с помощью style.theme_names().

.
...