2015-02-06 187 views
8

我想知道如果你可以幫助我在ttk中的樣式選項問題。我已經設法將大部分基本ttk小部件更改爲我偏好的樣式。我只是在改變滾動條的樣式。我搜索了幾個小時尋找答案,不幸的是無濟於事。更改tkinter中滾動條的外觀(使用ttk樣式)

下面是一個使用滾動條樣式選項示例代碼:

import tkinter as tk     
from tkinter import ttk 

class Gui: 
    def __init__(self,mainframe): 

     #set the style 
     style = ttk.Style() 
     style.configure('Horizontal.TScrollbar',background = "blue") 

     #Create a mainframe 
     self.mainframe = mainframe 
     self.mainframe.title("example") 


     #creating scrollbar frame 
     scrl_attr_frame = ttk.Frame(self.mainframe)        
     scrl_attr_frame.grid(column=0,row=5,sticky="ns")           
     scrl_attr_frame.rowconfigure(0, weight=1)             
     attr_canvas = tk.Canvas(scrl_attr_frame)             
     h_scroll = ttk.Scrollbar(scrl_attr_frame,orient="horizontal", command=attr_canvas.xview) 
     attr_canvas.configure(xscrollcommand=h_scroll.set)          
     attr_canvas.grid(column=0,row=0,sticky="ns")                    
     h_scroll.grid(column=0, row=1,sticky="we") 
     attr_frame = ttk.Frame(attr_canvas)               
     attr_frame.grid(column=0,row=0,sticky="ns")             
     attr_canvas.create_window((0,0),window=attr_frame, anchor='nw') 
     attr_frame.bind("<Configure>",lambda event, canvas=attr_canvas : canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200,takefocus=False,highlightthickness=0))#attribute_frame.winfo_height()/20,highlightthickness=0)) 

     #setup treeview widget 
     tree_columns = ("c1", "c2", "c3") 

     self.tree = ttk.Treeview(attr_frame,columns=tree_columns, show="headings",takefocus=False) 
     self.tree.grid(column=0, row=0, sticky='nsew') 

     for head in tree_columns: 
      self.tree.heading(head,text=head,anchor="w") 


root = tk.Tk() 
myapp = Gui(root) 
root.mainloop() 

我也嘗試過多種組合,包括;

style.configure('TScrollbar',background='blue') 

#and 
style.configure('CustomScroll.Horizontal.TScrollbar',background='blue') 

#in combination with 
h_scroll = ttk.Scrollbar(scrl_attr_frame,orient="horizontal", command=attr_canvas.xview) 
h_scroll['style'] = "CustomScroll.Horizontal.TScrollbar" 

非常感謝您的幫助!

+0

這將是,如果當有人創造的東西也給了與示例的完整文檔不錯,否則什麼都不做會更生產力。 – nbro 2015-02-06 22:33:43

+0

什麼平臺?某些平臺上的某些原生小部件無法更改。 – 2015-02-06 22:44:39

+0

@StephanL我想你是在Mac上,你甚至不能看到水平滾動條... – nbro 2015-02-06 22:54:48

回答

0

這似乎不可能在Windows上的tkinter。 下面的答案是這麼說的: ScrolledText Scrollbar Color (Python Tkinter)

滾動文檔:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/scrollbar.html 支持的樣式字段:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Scrollbar.html

我試圖通過這兩個「背景」和不成功我的Windows機器上「troughcolor」。我也嘗試將樣式應用於常規滾動條: style.configure('TScrollbar',background =「blue」) 我的解決方案都無法工作。

也是另一個論壇上發帖同意,你不能風格的滾動條背景這裏: http://www.gossamer-threads.com/lists/python/python/822292

4

看起來你只是想改變槽下的Windows主題水平滾動條。 ttk小部件由一組由元素引擎提供的元素構建,並使用聲明的佈局進行組合。在Windows下,樣式引擎是Windows Visual Styles API,這意味着程序員不能控制用於繪製大多數常用元素的顏色或圖像。 Windows提供了按鈕背景,滾動條槽和按鈕,拇指以及滾動條拇指內部繪製的手柄。

可能需要控制此應用程序定製,但代價是讓您的應用程序不再在給定平臺上看起來標準。爲此,您必須提供您自己的UI元素並定義新的小部件佈局。最終,這可以變成定義你自己的主題。 ttk庫中的tcl腳本提供了很好的示例,甚至還有一些完整的(如果是舊的)主題使用位圖來聲明原始版本的ttk中稱爲「tile」的基於圖像的主題元素。

在這個具有自定義彩色背景的Windows水平滾動條的特定示例中,我們需要重新定義佈局以使用Tk繪製元素中的滾動條槽。 'default'主題中使用的元素可以被複制,並且使用樣式配置參數進行定義,然後由Tk自己繪製,而不是傳遞給第三方引擎。下面的代碼生成一個像這樣的滾動條,它使用由vsapi樣式引擎提供的標準按鈕和大拇指,但替換了低谷。此導入槽瞭解troughcolor樣式配置選項,因此我們可以定義現在使用的顏色。所有使用此風格的滾動條將使用相同的顏色,因爲小部件本身不會接受槽選項。即:除非您爲每種新顏色定義新樣式,否則不能讓一個滾動條呈藍色,另一個呈紅色。

enter image description here

from tkinter import * 
from tkinter.ttk import * 

def main(): 
    app = Tk() 
    style = Style() 

    # import the 'trough' element from the 'default' engine. 
    style.element_create("My.Horizontal.Scrollbar.trough", "from", "default") 

    # Redefine the horizontal scrollbar layout to use the custom trough. 
    # This one is appropriate for the 'vista' theme. 
    style.layout("My.Horizontal.TScrollbar", 
     [('My.Horizontal.Scrollbar.trough', {'children': 
      [('Horizontal.Scrollbar.leftarrow', {'side': 'left', 'sticky': ''}), 
      ('Horizontal.Scrollbar.rightarrow', {'side': 'right', 'sticky': ''}), 
      ('Horizontal.Scrollbar.thumb', {'unit': '1', 'children': 
       [('Horizontal.Scrollbar.grip', {'sticky': ''})], 
      'sticky': 'nswe'})], 
     'sticky': 'we'})]) 
    # Copy original style configuration and add our new custom configuration option. 
    style.configure("My.Horizontal.TScrollbar", *style.configure("Horizontal.TScrollbar")) 
    style.configure("My.Horizontal.TScrollbar", troughcolor="red") 

    # Create and show a widget using the custom style 
    hs = Scrollbar(app, orient="horizontal", style="My.Horizontal.TScrollbar") 
    hs.place(x=5, y=5, width=150) 
    hs.set(0.2,0.3) 

    app.mainloop() 

if __name__ == '__main__': 
    main() 
0

如果使用clam主題很簡單:

import tkinter as tk 
from tkinter import ttk 

root = tk.Tk() 
style = ttk.Style() 
style.theme_use('clam') 

# list the options of the style 
# (Argument should be an element of TScrollbar, eg. "thumb", "trough", ...) 
print(style.element_options("Horizontal.TScrollbar.thumb")) 

# configure the style 
style.configure("Horizontal.TScrollbar", gripcount=0, 
       background="Green", darkcolor="DarkGreen", lightcolor="LightGreen", 
       troughcolor="gray", bordercolor="blue", arrowcolor="white") 

hs = ttk.Scrollbar(root, orient="horizontal") 
hs.place(x=5, y=5, width=150) 
hs.set(0.2,0.3) 

root.mainloop()