2015-01-11 2 views
2

Я объединил полосу прокрутки с ноутбуком ttk, адаптировав это example и дополнительно портируя его на Python3.получить фон по умолчанию ttk.Frame

Я использую виджеты ttk как можно чаще, чтобы получить более «современный» интерфейс. Тем не менее, нет виджета ttk canvas, поэтому я использовал стандартный холст tkinter. По умолчанию фоновый рисунок виджета canvas выглядит белым (по крайней мере, в 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() 

ответ

4

Вы можете использовать s.lookup(), чтобы получить настройки стиля. Если вы хотите, чтобы фон настройки вашего TTK использования кадров:

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

Что вы можете обратиться к вашей Canvas:

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

В общем, это объясняет, как получить настройки данного стиля, который в основном решает половина моего вопроса. Однако после передачи фона на холст ничего не изменилось (по крайней мере, на Mac). При тестировании одного и того же кода в Windows выяснилось, что фон имеет правильный цвет автоматически (без передачи его из style.lookup). Я думаю, что странное поведение Mac OS Tkinter связано с некоторыми недостатками Tk на Mac, потому что я использую версию Tkinter по умолчанию, а не рекомендованную версию ActiveTcl, но я не доказал этого ... – albert

+0

У меня только Windows PC, поэтому я боюсь, что не могу помочь вам в решении любых проблем, связанных с Mac OS, поскольку я не могу их воспроизвести. Вы проверили, что 'bg' содержит цвет, который вы ожидали? – fhdrsdg

+0

Я ожидал, что по умолчанию Mac серый (не знаю, как это называется). Однако 'print (bg)' возвращает 'systemWindowBody'. – albert

Смежные вопросы