Hintergrund transparent?

Fragen zu Tkinter.
Antworten
RainerWalesch
User
Beiträge: 6
Registriert: Freitag 9. Oktober 2009, 12:15

Kann man den Hintergrund eines Widgets in Tkinter transparent machen?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

RainerWalesch hat geschrieben:Kann man den Hintergrund eines Widgets in Tkinter transparent machen?
Gib mal ein konkretes Beispiel, was du erreichen willst.
RainerWalesch
User
Beiträge: 6
Registriert: Freitag 9. Oktober 2009, 12:15

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).
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Zumindest scheint es keine einfache Methode zu geben...
http://www.python-forum.de/topic-19374.html
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Rainer Walesch

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

Gruss wuf :wink:
Take it easy Mates!
RainerWalesch
User
Beiträge: 6
Registriert: Freitag 9. Oktober 2009, 12:15

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
RainerWalesch
User
Beiträge: 6
Registriert: Freitag 9. Oktober 2009, 12:15

Hallo wuf,

was ist das PIL? Wo bekommt man es her?

Grüsse
RainerWalesch
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
RainerWalesch
User
Beiträge: 6
Registriert: Freitag 9. Oktober 2009, 12:15

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

......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:
Take it easy Mates!
RainerWalesch
User
Beiträge: 6
Registriert: Freitag 9. Oktober 2009, 12:15

Hallo wuf,

danke.

Grüsse

Rainer
Antworten