Farbübergang??

Fragen zu Tkinter.
Antworten
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

Kann man z.B. bei einen normalen blauen Canvasfenster einen Farbübergang einbauen??? Ich meine so was wie von dunkelblau zu hellblau oder so??!
Hab nur Interesse ob so was mit python überhaupt möglich ist!

gruß meister56
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

meister56 hat geschrieben:Kann man z.B. bei einen normalen blauen Canvasfenster einen Farbübergang einbauen??? Ich meine so was wie von dunkelblau zu hellblau oder so??!
Hab nur Interesse ob so was mit python überhaupt möglich ist!
Ja.
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

Und wie geht so etwas??
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo meister56

Hier ein ein Versuchsskript um einen Farbverlauf auf einer Canvas zu erzeugen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#~~ Skriptname tk_color_fading_01.py (wuf)

#~~ Versuch: Horizontaler Farbverlauf auf einer Canvas mit Hilfe
#   eines PhotoImage-Objektes

import Tkinter as tk

root = tk.Tk()

data = list(xrange(256)) # 0..255

reverse_fading = False

if reverse_fading:
    data.reverse()

#~~ Erzeugt ein PhotoImage-Objekt
photo_image = tk.PhotoImage(width=len(data), height=1)

fade_color = 'dark_red'

format = "#%02x%02x%02x"
fade_function = {
    'dark_blue'  : lambda v: format % (0, 0, v),
    'dark_green' : lambda v: format % (0, v, 0),
    'dark_red'   : lambda v: format % (v, 0, 0),
    'brite_blue' : lambda v: format % (v, v, 255),
    'brite_green': lambda v: format % (v, 255, v),
    'brite_red'  : lambda v: format % (255, v, v),
    }.get(fade_color, lambda v: format % (0, 255, v))

#~~ Färbt die Fläche des PhotoImage-Objektes ein
photo_image.put((tuple(map(fade_function, data)),))

#~~ Skaliert die Fläche des PhotoImage-Objektes
photo_image = photo_image.zoom(4, 300)

#~~ Ermittelt die Breite & Höhe des PhotoImages-Objektes
image_width = photo_image.width()
image_height = photo_image.height()

#~~ Canvas für die Aufnahme des Photo-Images (Geometrie ist abhängig von der
#   Breite und Höhe des PhotoImage-Objektes)
canvas = tk.Canvas(root, bd=0, highlightthickness=0, width=image_width,
    height=photo_image.height())
canvas.pack()

#~~ Platziert das PhotoImage-Objekt auf die Canvas
image = canvas.create_image(0, 0, image=photo_image, anchor='nw')

root.mainloop()
Gruss wuf :wink:
Take it easy Mates!
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

ok danke!

gruß meister56
Benutzeravatar
__blackjack__
User
Beiträge: 13549
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Update auf Python 3 + Auswahl der Farbverläufe und „reverse“ in der GUI statt vor dem Start im Quelltext:

Code: Alles auswählen

#!/usr/bin/env python3
# Skriptname tk_color_fading_01.py (wuf)
#
# Versuch: Horizontaler Farbverlauf auf einer Canvas mit Hilfe eines
#   PhotoImage-Objektes.

import tkinter as tk

START_COLOR = "dark_red"
COLOR_NAME_TO_FADE_FUNCTION = {
    "dark_blue": lambda value: (0, 0, value),
    "dark_green": lambda value: (0, value, 0),
    "dark_red": lambda value: (value, 0, 0),
    "brite_blue": lambda value: (value, value, 255),
    "brite_green": lambda value: (value, 255, value),
    "brite_red": lambda value: (255, value, value),
    "gray": lambda value: (value, value, value),
}
assert START_COLOR in COLOR_NAME_TO_FADE_FUNCTION


def color_from_rgb(rgb):
    return "#{:02x}{:02x}{:02x}".format(*rgb)


def create_image(label, fade_function, reverse_fading):
    data = list(range(256))
    if reverse_fading:
        data.reverse()

    image = tk.PhotoImage(width=len(data), height=1)
    image.put((tuple(color_from_rgb(fade_function(value)) for value in data),))
    image = image.zoom(4, 300)
    label["image"] = image
    label.image = image


def main():
    root = tk.Tk()

    label = tk.Label(root, highlightthickness=0, border=0)
    label.pack()

    frame = tk.Frame(root)
    frame.pack()

    color_var = tk.StringVar(root)
    reversed_var = tk.BooleanVar(root)

    color_options = tk.OptionMenu(
        frame, color_var, *COLOR_NAME_TO_FADE_FUNCTION.keys()
    )
    color_options.pack(side=tk.LEFT)
    reversed_checkbutton = tk.Checkbutton(
        frame, text="reverse", variable=reversed_var
    )
    reversed_checkbutton.pack(side=tk.LEFT)

    color_var.set(START_COLOR)
    reversed_var.set(False)

    def callback(*_args):
        create_image(
            label,
            COLOR_NAME_TO_FADE_FUNCTION[color_var.get()],
            reversed_var.get(),
        )

    color_var.trace("w", callback)
    reversed_checkbutton["command"] = callback
    callback()

    root.mainloop()


if __name__ == "__main__":
    main()
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten