首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让ttk使用OS主题?

如何让ttk使用OS主题?
EN

Stack Overflow用户
提问于 2018-08-26 10:16:21
回答 1查看 2K关注 0票数 3

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

有没有办法让我的ttk小部件使用操作系统的主题?

代码语言:javascript
复制
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小部件的示例:

编辑:所以这不是一个真正的修复,但我可以设置正确的颜色:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 22:03:45

我使用的是XFCE桌面环境,甚至tk小部件都不适合我使用的主题,这并不奇怪,因为XFCE是基于GTK GUI工具包的,所以没有理由使用GTK主题来影响Tk主题。

因此,您需要手动更改图形用户界面的主题,而设置ttk小部件颜色的唯一方法是通过ttk.Style

代码语言:javascript
复制
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 widget都关联到一个样式(通常是'T +widget name',除了没有额外的‘T’的Treeview )。这些样式是由您使用的ttk主题定义的。您可以使用style.theme_use(<theme name>)更改主题,也可以使用style.theme_names()获取可用的主题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52022680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档