Seite 1 von 1

Farbübergang??

Verfasst: Sonntag 14. Juni 2009, 13:13
von meister56
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

Re: Farbübergang??

Verfasst: Sonntag 14. Juni 2009, 13:38
von numerix
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.

Verfasst: Sonntag 14. Juni 2009, 19:18
von meister56
Und wie geht so etwas??

Verfasst: Montag 15. Juni 2009, 10:07
von wuf
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:

Verfasst: Montag 15. Juni 2009, 11:28
von meister56
ok danke!

gruß meister56

Re: Farbübergang??

Verfasst: Sonntag 27. Oktober 2024, 10:48
von __blackjack__
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()