获取ttk.Frame的默认背景

时间:2015-01-11 22:49:34

标签: python canvas tkinter tk ttk

我通过调整此example并将其移植到Python3,将滚动条与ttk笔记本结合起来。

我正在尽可能多地使用ttk小部件来获得更多现代化的小部件。 UI。但是,没有ttk canvas小部件,所以我使用了标准的tkinter画布。默认情况下,canvas小部件的backgroundcolor似乎是白色的(至少在Mac OS上),而所有ttk小部件的默认背景都是灰色的(见下面的截图)。

如何获取包含标签小部件的ttk框架的默认背景,以便我可以通过Canvas(parent, background='bg_color')将其传递到画布并删除包含ttk标签的ttk框架周围的空白区域?

我知道ttk使用styles来定义小部件的外观。但是,我不知道如何读取(默认)样式的背景值。

screenshot

#!/usr/bin/env python3
# coding: utf-8

from tkinter import *
from tkinter import ttk

master = Tk()

def populate():
    """Put in some fake data"""
    for row in range(100):
        ttk.Label(frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0)
        t="this is the second column for row %s" % row
        ttk.Label(frame, text=t).grid(row=row, column=1)

def OnFrameConfigure(event):
    """Reset the scroll region to encompass the inner frame"""
    canvas.configure(scrollregion=canvas.bbox("all"))

nbook = ttk.Notebook(master)
nbook.grid()
tab = Frame(nbook)

canvas = Canvas(tab, borderwidth=0)
frame = ttk.Frame(canvas)
vsb = Scrollbar(tab, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side='left', fill='both', expand=True)
canvas.create_window((0, 0), window=frame, anchor='nw', tags='frame')

frame.bind("<Configure>", OnFrameConfigure)

populate()

nbook.add(tab, text='Test')

master.mainloop()

3 个答案:

答案 0 :(得分:4)

您可以使用s.lookup()来获取样式的设置。如果您想使用ttk Frame的背景设置:

s = ttk.Style()
bg = s.lookup('TFrame', 'background')

您可以将其应用于您的画布:

canvas = Canvas(tab, borderwidth=0, background=bg)

答案 1 :(得分:0)

我遇到了类似的问题。将背景色设置为“ systemWindowBody”不会执行任何操作。

进一步搜索后,我发现该网站带有tkinter颜色(http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter

enter image description here

我发现与Mac OS灰色最接近的匹配项是'gray93'。也许可以帮助您获得相同的颜色。

答案 2 :(得分:0)

对于任何对如何获取框架(或小部件)的颜色感到好奇的人,您可以使用以下行

class MotherMetaClass(type):
    def __new__(cls, name, bases, attrs):
        method_name = 'necessary_method'
        mother_class_name = 'Mother'
        original_necessary_method = attrs.get(method_name)

        def necessary_method_validated(*args, **kwargs):
            original_necessary_method(*args, **kwargs)

            if name == mother_class_name:
                cls.mother_method_called = True
            else:
                if not cls.mother_method_called:
                    raise ValueError(f'Must call "super()" when overriding "{method_name}".')
                cls.mother_method_called = False

        attrs[method_name] = necessary_method_validated

        return super().__new__(cls, name, bases, attrs)


class Mother(metaclass=MotherMetaClass):
    def necessary_method(self):
        print('Parent method called.')


class GoodChild(Mother):
    def necessary_method(self):
        super().necessary_method()
        print('Good child method called.')


class BadChild(Mother):
    def necessary_method(self):
        print("Bad child method called.")


a = GoodChild()
a.necessary_method()  # it's going to work properly


b = BadChild()
b.necessary_method()  # it's going to raise Value Error

其中 widget 是您要从中检索背景颜色的小部件。

因此,对于框架,您可以:

widget.cget('bg')