如何在Mac上为ttk/Tkinter的Notebook中的Frame匹配背景颜色?

4 投票
1 回答
3684 浏览
提问于 2025-04-28 15:02

在我的Mac上使用Tkinter和ttk做图形界面时,我发现了一个关于背景颜色和Notebook小部件的问题。当我把一个ttk.Frame作为ttk.Notebook的标签时,显示的框架背景颜色和Notebook标签的“内嵌”背景颜色不一致。

我该如何让ttk.Frame的背景颜色和周围的背景颜色一致,而不想给出一个在非Mac用户看来奇怪的固定值呢?

框架背景不匹配的例子

我看了一些StackOverflow的回答,建议使用自定义样式,但在这种情况下,如何查询父小部件的背景颜色并不清楚。就我所知,它们似乎都是一样的!

>>> ttk.Style().lookup("TFrame", "background")
'systemWindowBody'
>>> ttk.Style().lookup("Notebook", "background")
'systemWindowBody'
>>> ttk.Style().lookup("Notebook.client", "background")
'systemWindowBody'
>>> ttk.Style().lookup("Notebook.tab", "background")
'systemWindowBody'

上面截图的示例代码:

import Tkinter
import ttk

class GUI(object):
    def __init__(self,root):
        self.root = root
        self.root.title(u"Frame Mismatch Example")
        self.mainframe = ttk.Frame(self.root, padding=(6, 6, 12, 12))
        self.mainframe.grid(sticky='nwse')

        self.notebook = ttk.Notebook(self.mainframe)
        self.tab1 = ttk.Frame(self.notebook)
        ttk.Button(self.tab1, text='Exit', command=self.root.destroy).pack(padx=100, pady=100)
        self.notebook.add(self.tab1, text="Tab 1")
        self.notebook.pack()

def main():
    root = Tkinter.Tk()
    root.columnconfigure(0, weight=1)
    root.rowconfigure(0, weight=1)
    makeGUI = GUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()

重要细节:这个问题出现在Python 2.7.8和Tcl/Tk 8.5.15上(通过Tk.eval('info patchlevel')确认)。

暂无标签

1 个回答

2

我遇到了 'systemWindowBody' 的问题,然后我用 sys.platform 检查了一下操作系统,结果只为OSX硬编码了颜色。

如果你有很多小部件,可以为OSX使用一个特定的主题。(我找到一个不错的tkinter主题的回答:改变ttk.Notebook中“标签头”的颜色

我知道这可能不是最理想的解决方案,但至少可以确保你在其他平台上不会搞砸界面的外观。

撰写回答