2015-02-06 4 views
8

Ich habe mich gefragt, ob Sie mir mit einem Problem mit Stiloptionen in ttk helfen könnten. Ich habe es geschafft, die meisten grundlegenden ttk-Widgets in den Stil meiner Vorliebe zu ändern. Ich bin nur daran fest, den Stil einer Bildlaufleiste zu ändern. Ich habe stundenlang nach einer Antwort gesucht, leider ohne Erfolg.Ändern der Darstellung einer Bildlaufleiste in tkinter (mit ttk-Stilen)

Hier ist ein Beispielcode die Scrollbar Style-Option:

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() 

ich mehrere Kombinationen auch einschließlich versucht;

Vielen Dank für Ihre Hilfe!

+0

Es wäre schön, wenn, wenn jemand schafft etwas gab auch die komplette Dokumentation mit Beispielen, sonst nichts zu tun, wäre mehr produktiv. – nbro

+0

Welche Plattform? Einige native Widgets auf einigen Plattformen können nicht geändert werden. –

+0

@StephanL Ich nehme an, Sie sind auf einem Mac und Sie können nicht einmal die horizontale Scrollbar sehen ... – nbro

Antwort

0

Dies scheint im tkinter unter Windows nicht möglich zu sein. Die unten Antwort sagt so: ScrolledText Scrollbar Color (Python Tkinter)

Scrollbar Dokumentation: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/scrollbar.html Unterstützte Stil Felder: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Scrollbar.html

Ich habe versucht, beide 'Hintergrund' vorbei und 'troughcolor' erfolglos auf meinem Windows-Rechner. Ich habe auch versucht, den Stil auf die allgemeine Bildlaufleiste anwenden: style.configure ('TScrollbar', Hintergrund = "blau") Keine meiner Lösungen funktioniert.

Auch ein anderes Forum Post stimmt zu, dass Sie nicht den Scrollbar Hintergrund hier stylen können: http://www.gossamer-threads.com/lists/python/python/822292

4

Es sieht aus wie Sie wollen einfach nur für einen horizontalen Scrollbalken unter dem Windows-Design den Trog ändern. Die ttk-Widgets werden aus einer Reihe von Elementen erstellt, die von einer Styling-Engine zur Verfügung gestellt und mit dem deklarierten Layout kombiniert werden. Unter Windows ist die Styling Engine die Windows Visual Styles API, was bedeutet, dass der Programmierer keine Kontrolle über die Farben oder Bilder hat, die zum Zeichnen der meisten gebräuchlichen Elemente verwendet werden. Der Tastenhintergrund, die Bildlaufleiste und die Schaltflächen sowie der Daumen und sogar der Griff, der in den Bildlaufleisten gezogen wird, werden von Windows bereitgestellt.

Es ist möglich, die Kontrolle über diese für die Anpassung der Anwendung zu übernehmen, aber auf Kosten der machen Ihre Anwendung nicht mehr Standard auf der gegebenen Plattform. Dazu müssen Sie eigene UI-Elemente bereitstellen und neue Widget-Layouts definieren. Letztendlich kann dies zur Definition eines eigenen Themas führen. Die tcl-Skripte in der ttk-Bibliothek bieten gute Beispiele und es gibt sogar einige komplette (wenn alt) Themen, die Bitmaps verwenden, um bildbasierte Designelemente in der ursprünglichen Version von ttk zu deklarieren, die "tile" genannt wurde.

In diesem speziellen Beispiel, um eine Windows horizontale Bildlaufleiste mit einem benutzerdefinierten farbigen Hintergrund zu erhalten, müssen wir das Layout neu definieren, um die Scrollbar Trog von den Tk gezeichneten Elemente zu verwenden. Die im Standard-Design verwendeten Elemente können kopiert und mithilfe von Style-Konfigurationsparametern definiert werden. Sie werden dann von Tk selbst gezeichnet und nicht an eine Engine eines Drittanbieters übergeben. Der folgende Code erzeugt eine Bildlaufleiste wie diese, die die Standardtasten und den Daumen der vsapi-Stying-Engine verwendet, aber die Tube ersetzt. Dieser importierte Trog versteht die troughcolor Stil-Konfigurationsoption und so können wir jetzt eine Farbe definieren. Alle Bildlaufleisten, die diesen Stil verwenden, verwenden die gleiche Farbe, da das Widget selbst keine Option für die Option trumcolor akzeptiert. Dh: Sie können nicht eine Bildlaufleiste blau und eine andere rot sein, es sei denn, Sie definieren für jede neue Farbe einen neuen Stil.

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

Es ist einfacher, wenn Sie das clam Thema verwenden:

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()