我通过调整此example并将其移植到Python3,将滚动条与ttk笔记本结合起来。
我正在尽可能多地使用ttk小部件来获得更多现代化的小部件。 UI。但是,没有ttk canvas小部件,所以我使用了标准的tkinter画布。默认情况下,canvas小部件的backgroundcolor似乎是白色的(至少在Mac OS上),而所有ttk小部件的默认背景都是灰色的(见下面的截图)。
如何获取包含标签小部件的ttk框架的默认背景,以便我可以通过Canvas(parent, background='bg_color')
将其传递到画布并删除包含ttk标签的ttk框架周围的空白区域?
我知道ttk使用styles
来定义小部件的外观。但是,我不知道如何读取(默认)样式的背景值。
#!/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()
答案 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)
我发现与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')