Seite 1 von 1

Hintergrund transparent?

Verfasst: Sonntag 18. Oktober 2009, 08:25
von RainerWalesch
Kann man den Hintergrund eines Widgets in Tkinter transparent machen?

Re: Hintergrund transparent?

Verfasst: Sonntag 18. Oktober 2009, 10:18
von numerix
RainerWalesch hat geschrieben:Kann man den Hintergrund eines Widgets in Tkinter transparent machen?
Gib mal ein konkretes Beispiel, was du erreichen willst.

Hintergrund transparent?

Verfasst: Sonntag 18. Oktober 2009, 13:26
von RainerWalesch
Hallo numerix,

ich möchte ein Label anzeigen, jedoch so, dass nur die Schrift sichtbar ist und ein dahinter liegendes Bild durchscheint (nicht durch das Rechteck mit der background-color des Labels verdeckt ist).

Verfasst: Sonntag 18. Oktober 2009, 16:33
von Pascal
Zumindest scheint es keine einfache Methode zu geben...
http://www.python-forum.de/topic-19374.html

Verfasst: Sonntag 18. Oktober 2009, 23:16
von wuf
Hallo Rainer Walesch

Meinst du so etwas:
http://paste.pocoo.org/show/145745/

Gruss wuf :wink:

Verfasst: Montag 19. Oktober 2009, 05:24
von RainerWalesch
wuf hat geschrieben:Hallo Rainer Walesch

Meinst du so etwas:
http://paste.pocoo.org/show/145745/

Gruss wuf :wink:
Hallo wuf,

vom Ergebnis der Darstellung ist es der gewünschte Effekt. Von der Programmierung her hätte ich mir so etwas in der Art gewünscht, wie es Pascal beschrieben hat. Aber so etwas gibt es ja anscheinend in tkinter nicht.
Danke für die Beiträge.

Verfasst: Montag 19. Oktober 2009, 20:44
von wuf
Hallo RainerWalesch

Mit der Zuhilfenahme des PIL-Packages lässt sich etwas machen.. Das folgende Testskript zeichnet ein durchsichtiges Rechteck auf ein jpg-Bild. Das Bild 'my_image.jpg' musst du selber zur Verfügung stellen:

Code: Alles auswählen

# wuf_ref: blended_rectangle_01_01.py

import Tkinter as    tk
from   PIL    import Image, ImageTk, ImageDraw
from   os     import listdir,curdir

class BlendedRectangle(object):

    def __init__(self, xpos=0, ypos=0, width=10, height=10, image=None,
            fill='black', intensity=1.0):

            self.xpos = xpos
            self.ypos = ypos
            self.width = width
            self.height = height
            self.image = image
            self.fill = fill
            self.intensity = intensity

            #~~ Label-Koordinaten
            self.coords = (self.xpos, self.ypos, self.xpos+self.width,
                self.ypos+self.height)

            #~~ Labelhintergrung Imageobjekt
            self.bottom_image = self.image.crop(self.coords)

            #~~ Labelvordergrung Imageobjekt
            self.top_image = self.image.crop(self.coords)

            self.draw = ImageDraw.Draw(self.top_image)

            self.draw.polygon([
                (0, 0), (self.width, 0), (self.width, self.height),
                (0, self.height), (0, 0)], fill= self.fill)

            self.blended_graphic_obj = Image.blend(self.bottom_image,
                self.top_image, self.intensity)

            self.image.paste(self.blended_graphic_obj, (self.xpos , self.ypos))

            self.tk_image  = ImageTk.PhotoImage(self.image)

root = tk.Tk()

image = Image.open("my_image.jpg")
image_width, image_height = image.size

canvas = tk.Canvas(root, width=image_width, height=image_height)
canvas.pack()

image_obj = BlendedRectangle(10, 10, 50, 50, image, 'red', intensity=0.3)
canvas.create_image(0, 0, image=image_obj.tk_image, anchor='nw')

root.mainloop()
Gruss wuf :wink:

Verfasst: Montag 19. Oktober 2009, 21:00
von RainerWalesch
Hallo wuf,

was ist das PIL? Wo bekommt man es her?

Grüsse
RainerWalesch

Verfasst: Montag 19. Oktober 2009, 21:08
von lunar

Verfasst: Montag 19. Oktober 2009, 21:18
von wuf
RainerWalesch

Das PIL-Package kannst du hier runterladen:
http://www.pythonware.com/products/pil/

Die Kommentarzeilen 20, 24, 27 in meinem Testskript stimmen nicht du kannst sie rauslöschen.

Gruss wuf :wink:

Verfasst: Dienstag 20. Oktober 2009, 07:00
von RainerWalesch
wuf hat geschrieben:RainerWalesch

Das PIL-Package kannst du hier runterladen:
http://www.pythonware.com/products/pil/

Die Kommentarzeilen 20, 24, 27 in meinem Testskript stimmen nicht du kannst sie rauslöschen.

Gruss wuf :wink:
Hallo wuf,

danke für den Tip

Gruss Rainer

Verfasst: Dienstag 20. Oktober 2009, 10:26
von wuf
......Hier als Fortsetzung noch ein Testskript mit transparenten Labels:

Code: Alles auswählen

# wuf_ref: blended_label_01_01.py

import Tkinter as    tk
from   PIL    import Image, ImageTk, ImageDraw, ImageFont
from   os     import listdir,curdir

class BlendedLabel(object):

    def __init__(self, xpos=0, ypos=0, image=None, text='', color='black',
            font_type=None, font_size=10, intensity=1.0):

            self.xpos = xpos
            self.ypos = ypos
            self.image = image
            self.label_text = text
            self.label_color = color
            self.font_type = font_type
            self.font_size = font_size
            self.intensity = intensity

            #~~ Erstelle Truetype-Objekt
            self.label_font = ImageFont.truetype(self.font_type,
                self.font_size)

            #~~ Ermittle die Abmessungen des Labeltextes
            self.label_width, self.label_height = self.label_font.getsize(
                self.label_text)

            #~~ Label-Koordinaten
            self.coords = (self.xpos, self.ypos, self.xpos+self.label_width,
                self.ypos+self.label_height)

            #~~ Labelhintergrung Imageobjekt
            self.label_back_image = self.image.crop(self.coords)

            #~~ Labelvordergrung Imageobjekt
            self.label_front_image = self.image.crop(self.coords)

            #~~ Schreibe den Labeltext auf das Labelvordergrund Imageobjekt
            self.draw = ImageDraw.Draw(self.label_front_image)
            self.draw.text((0, 0), self.label_text,
                fill=self.label_color, font=self.label_font)

            self.label_blended = Image.blend(self.label_back_image,
                self.label_front_image, self.intensity)

            self.image.paste(self.label_blended, (self.xpos , self.ypos))

            self.tk_image  = ImageTk.PhotoImage(self.image)

#~~ Haupt-Fenster erzeugen
root = tk.Tk()

canvas = tk.Canvas(root, width=1000, height=700)
canvas.pack()

image = Image.open("my_image.jpg")

#~~ Label mit 50% Intensität
image_obj = BlendedLabel(10, 10, image, 'Label', 'red', 'my_truetype_font.ttf',
    40, 0.5)

canvas.create_image(0, 0, image=image_obj.tk_image, anchor='nw')

#~~ Label mit 30% Intensität
image_obj = BlendedLabel(10, 50, image, 'Label', 'red', 'my_truetype_font.ttf',
    40, 0.3)
canvas.create_image(0, 0, image=image_obj.tk_image, anchor='nw')

root.mainloop()
Das jpg-Bild und ttf-Fonts musst du selber zur Verfügung stellen. Bei Linux SuSE11.0 habe ich einige ttf-Zeichensätze unter:
/usr/share/fonts/truetype
gefunden.

Gruss wuf :wink:

Verfasst: Dienstag 20. Oktober 2009, 10:37
von RainerWalesch
Hallo wuf,

danke.

Grüsse

Rainer