Seite 1 von 1

Farbige Buttons mit TTK?

Verfasst: Samstag 26. April 2014, 04:11
von thaloss
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()

Re: Farbige Buttons mit TTK?

Verfasst: Samstag 26. April 2014, 13:29
von 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()

Re: Farbige Buttons mit TTK?

Verfasst: Sonntag 27. April 2014, 11:19
von thaloss
Leider eben nicht, das gibt nur nen roten bzw. blauen Rahmen, zumindest unter Win 7.
Bild

Re: Farbige Buttons mit TTK?

Verfasst: Sonntag 27. April 2014, 11:20
von thaloss
Sorry warum der snapshot hier so groß wird ist mir schleierhaft, war so nicht geplant

Re: Farbige Buttons mit TTK?

Verfasst: Sonntag 27. April 2014, 11:30
von BlackJack
@thaloss: Hm, das ist ja schon irgendwie ”themed” und nicht einfarbig. Vielleicht kann man da die Farbe gar nicht ändern‽

Re: Farbige Buttons mit TTK?

Verfasst: Dienstag 29. April 2014, 23:06
von thaloss
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.

Re: Farbige Buttons mit TTK?

Verfasst: Dienstag 29. April 2014, 23:21
von 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.

Re: Farbige Buttons mit TTK?

Verfasst: Samstag 17. Mai 2014, 18:06
von Ene Uran
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: