2015-02-10 32 views
3

以下代碼按預期方式工作,在綠色背景框架(也包含大量填充)中呈現紅色背景按鈕(帶有大量填充)。請注意,Frame填充是在Style聲明和ttk.Frame初始化中指定的。由Ttk框架忽略的樣式中指定的填充

import ttk 
import Tkinter 
root = Tkinter.Tk() 
ttk.Style().configure("TFrame", background="#0c0", padding=60) 
ttk.Style().configure("TButton", background="#c00", padding=20) 
frame = ttk.Frame(root, padding=60) 
frame.pack() 
btn = ttk.Button(frame, text="Button") 
btn.pack() 
root.mainloop() 

然而,現在去掉「填充= 60」從幀起始線(即frame = ttk.Frame(root)),留下只是在Style().configure(...)聲明,並在彈出的窗口中有幀中沒有填充(因此你不能說出背景顏色是什麼)。相反,只有紅色背景按鈕佔據整個窗口。無論Style語句如何,幀填充已恢復爲默認值0。

爲什麼忽略指定樣式「TFrame」的填充?另一個屬性(「背景」)正確應用於框架,並使用TButton樣式將填充和背景屬性正確應用於Button。

+0

有趣。你使用Windows,Mac或Linux?我在Ubuntu 14.04上檢查過它,結果和你一樣。不知道這是否是一些與操作系統相關的事情,或者是一些錯誤或其他問題 – Marcin 2015-02-11 07:23:59

+0

Mac OS X 10.9.5(Python 2.7.9)。我也在我的Ubuntu 14.04 VM(Python 2.7.6和3.4.0,如果你將python3改爲Tkinter-> tkinter,ttk-> tkinter.ttk)中嘗試過它。所有相同的結果。 – 2015-02-11 18:00:41

回答

3

TFrame的佈局不包含填充元素,因此沒有樣式元素可以在樣式中使用配置的填充值。

>>> from tkinter import * 
>>> from tkinter.ttk import * 
>>> style = Style() 
>>> style.theme_use('default') # select the Unix theme 
>>> style.layout("TFrame") 
[('Frame.border', {'sticky': 'nswe'})] 

在尋找的東西,做使用填充像一個TButton:

>>> style.layout("TButton") 
[('Button.border', {'border': '1', 'children': 
    [('Button.focus', {'children': 
     [('Button.padding', {'children': 
      [('Button.label', {'sticky': 'nswe'})], 
     'sticky': 'nswe'})], 
    'sticky': 'nswe'})], 
'sticky': 'nswe'})] 

在這種佈局中,我們有一個「邊界」的元素將利用borderwidth您可以通過檢查佈局看到這和relief配置選項。一個focus元素來處理顯示對焦環。並且還包含padding元素以包含配置的填充量。

TFrame樣式不使用任何填充元素。但是,Frame小部件確實使用了小部件填充值。在放置包含的小部件時,小部件本身使用它來定義內部填充。這不包括在樣式中,而是作爲特定於窗口小部件的選項。