Hintergrund transparent?
Verfasst: Sonntag 18. Oktober 2009, 08:25
Kann man den Hintergrund eines Widgets in Tkinter transparent machen?
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Gib mal ein konkretes Beispiel, was du erreichen willst.RainerWalesch hat geschrieben:Kann man den Hintergrund eines Widgets in Tkinter transparent machen?
Hallo wuf,wuf hat geschrieben:Hallo Rainer Walesch
Meinst du so etwas:
http://paste.pocoo.org/show/145745/
Gruss wuf
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()
Hallo wuf,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
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()