Farbige Buttons mit TTK?

Fragen zu Tkinter.
Antworten
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

Hallo,

wie schaffe ich es einen ttk.Button farbig zu machen?
Folgendes Beispiel verwendet eine tkinter Button, der jedesmal wenn er angeklickt wird, die Farbe wechselt.
Genau dieses Verhalten des dynamischen Farbwechsels versuche ich mit einem ttk Button hin zu bekommen.
Ich habe bisher nur farbigen Text oder einen dünnen farbigen Rahmen mittels style hinbekommen aber keine farbigen Hintergrund.
Oder kann man dem Button ein image hinterlegen und dieses wechseln? Hintergrund ist, dass ich einen Button
gezielt hervorheben möchte.
Ich arbeite mit Python 3.4 auf Win 7.

Code: Alles auswählen

from tkinter import *

cl = False

def Change_color():
    global cl
    if cl:
        tst_btn.configure(bg='red')
    else:
        tst_btn.configure(bg='blue')
    cl = not(cl)

root = Tk()
tst_btn = Button(root, text='Test', width=15, command=Change_color)
tst_btn.configure(fg='white',bg='red')
tst_btn.pack()

mainloop()
"In jedem kleinen Problem steckt ein großes das gerne raus will"
BlackJack

Die ”normale” Hintergrundfarbe hat den „state” '!active':

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk
import ttk
from functools import partial
from itertools import cycle


BUTTON_STYLE_NAME = 'my.TButton'


def change_colour(style_name, colours):
    ttk.Style().map(style_name, background=[('!active', next(colours))])


def main():
    root = tk.Tk()
    ttk.Style().map(
        BUTTON_STYLE_NAME,
        background=[('!active', 'red')],
        foreground=[('!active', 'white')]
    )
    ttk.Button(
        root,
        text='Test',
        style=BUTTON_STYLE_NAME,
        command=partial(
            change_colour, BUTTON_STYLE_NAME, cycle(['blue', 'red'])
        )
    ).pack()
    root.mainloop()


if __name__ == '__main__':
    main()
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

Leider eben nicht, das gibt nur nen roten bzw. blauen Rahmen, zumindest unter Win 7.
Bild
"In jedem kleinen Problem steckt ein großes das gerne raus will"
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

Sorry warum der snapshot hier so groß wird ist mir schleierhaft, war so nicht geplant
"In jedem kleinen Problem steckt ein großes das gerne raus will"
BlackJack

@thaloss: Hm, das ist ja schon irgendwie ”themed” und nicht einfarbig. Vielleicht kann man da die Farbe gar nicht ändern‽
thaloss
User
Beiträge: 15
Registriert: Mittwoch 26. März 2014, 13:59

Scheinbar ist ganze Betriebssystem abhängig, ich habe auf http://www.tkdocs.com/tutorial/widgets.html gesehen das dort der Button bei MAC
komplett blau wird, bei Windows eienn Blauen Rahmen hat und unter Linux nochmal anders aussieht. ttk scheint hier auf die Betriebssystem eigenen
Buttons zurück zu greifen. Ich habe auch festgestellt das die Buttons auf meinem Home PC anders aussehen als auf meinem Office PC obwohl beide unter
Win7/64 laufen aber mit unterschiedlichen Windows Themes.
Werde wohl meine eigenen Buttons machen und die Grafiken Switchen.
"In jedem kleinen Problem steckt ein großes das gerne raus will"
BlackJack

@thaloss: Da war doch auch das Ziel von TTK: die Leute besänftigen die immer rumgejammert haben das Tk-UIs überall sch*sse aussehen weil sie überall wie ein Fremdkörper aussehen, weil alles selbst gemacht ist und der Look irgendwo in den 70ern stehen geblieben ist. :-)

Bei den Bildern aus dem Tutorial ist übrigens nichts an den Buttons irgendwie extra eingefärbt, sondern der Okay-Button ist der ausgewählte Button/Default-Button.
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Ein moeglicher Ausweg ist ein Label auf den Button zu geben ...

Code: Alles auswählen

''' ttk_button_label2.py
a look at foreground/background colors

foreground/background works with a ttk label,
but not a ttk button the way you expect
so top the ttk button with a ttk label
'''

try:
    # Python27
    import Tkinter as tk
    import ttk
except ImportError:
    # Python31+
    import tkinter as tk
    import tkinter.ttk as ttk

def pressed(event):
    print('button has been pressed')

root = tk.Tk()

# use a label instead of text
ttk.Style().configure("RB.TButton", foreground='red', background='green')
ttk_btn = ttk.Button(root, text="", style="RB.TButton")
ttk_btn.pack(pady=10)

ttk.Style().configure("RB.TLabel", foreground="red", background="green")
ttk_label = ttk.Label(ttk_btn, text="ttk_Label", style="RB.TLabel")
ttk_label.pack(padx=4, pady=4)
ttk_label.bind('<Button-1>', pressed)

root.mainloop()
:lol:
Atomkraftwerkaktienbesitzer
Antworten