Bild mit Transparenz

Fragen zu Tkinter.
Antworten
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Hallo,

ich möchte mit Python und Tkinter die Windows-Funktion "Zeiger-Position beim Drücken der STRG-Taste anzeigen" (animierter Kreis um den Mauszeiger) nachbauen, um eine andere Taste belegen und eine eigene Animation festlegen zu können.

Hier mein Code soweit:

Code: Alles auswählen

from Tkinter import *
from PIL import Image
import ImageTk
import time

root = Tk()

def destroyTL():
	toplevel.destroy()

def addImage(event):
	global toplevel
	toplevel = Toplevel()
	toplevel.overrideredirect(1) #toplevel-Fensterrahmen verstecken

	pic1 = ImageTk.PhotoImage(im)
	label_image = Label(toplevel, image=pic1)
	label_image.place(x=0,y=0,width=im.size[0]-1,height=im.size[1]-1)
	
	for i in range(1,50):  # schleife durch 50 einzelbilder -> animation
		if i <=9:
			name = "000"+str(i)+".gif"
			pic = ImageTk.PhotoImage(Image.open(name))
			label_image.configure(image = pic, state=ACTIVE)
			label_image.image = pic
		else:
			name = "00"+str(i)+".gif"
			pic = ImageTk.PhotoImage(Image.open(name))
			label_image.configure(image = pic, state=ACTIVE)
			label_image.pic = pic
		time.sleep(0.015)
		toplevel.update()

	toplevel.after(200,destroyTL)

	


	
root.bind("<Return>", addImage)

root.withdraw() #root-Fenster verstecken

root.mainloop()
Die Schleife, die durch die Einzelbilder geht, funktioniert wunderbar, aber die .gif-Dateien, die ich benutze, werden nicht transparent angezeigt. Image.mode gibt "P" zurück, als ich .png-Dateien benutzt habe, war Image.mode "RGBA", aber auch keine Transparenz.
Was muss ich machen, damit die Bilder mit Transparenz angezeigt werden ?
Oder sollte ich nicht Tkinter benutzen sondern wxPython/pygame ?
Zuletzt geändert von asdman3000 am Sonntag 21. November 2010, 15:30, insgesamt 1-mal geändert.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Für transparente Bilder benötigst du die PIL.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Xynon1 hat geschrieben:Für transparente Bilder benötigst du die PIL.
...die ich doch eigentlich auch benutze :?:
( pic = ImageTk.PhotoImage(Image.open(name)) )
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

oh sry übersehen
Ich arbeite für sowas immer mit meinem eigenen Modul, etwas gewöhnungs bedürftig das mal wieder so zusehen.
Ist schon eine Weile her.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Soll ich dir mal mein modul schicken ?
Erleichtert eventuell auch dir das leben.

Ich vermute die Transparenz geht bei deiner umwandlung verloren.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Soll ich dir mal mein modul schicken ?
Erleichtert eventuell auch dir das leben.
Ich wäre für jede Vereinfachung dankbar.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Hab es dir als pm geschickt, dauert also etwas bis es ankommt, wenn du ne Frage hast bitte als pm.
Die Funktionen habe ich vorallem für imagesets gebaut.
Also ein Bild was aus mehreren gleich großen Bilder besteht, deine Umwandlungs geschichte ist natürlich dabei.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

@ Xynon1: Das mit deinem Modul hat auch nicht geklappt, ich hab bemerkt, dass mein Problem ein anderes ist:

Das Bild wird immer transparent dargestellt, aber die transparenten Bereiche werden mit der Hintergrundfarbe des Labels toplevel ausgefüllt.
Wie kann ich das verhindern?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

da gab es eine alpha option für das toplevel, die hat aber bei mir noch nie richtig funktioniert.

Dennoch hier der link: http://effbot.org/tkinterbook/wm.htm#Tk ... tes-method
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Die alpha option hat zwar funktioniert (so geschrieben: toplevel.attributes("-alpha" , 0.0) ), hat aber alles, also auch meine Bilderfolge, transparent gemacht. Bin dann allerdings auf die option transparentcolor gestoßen, hab den Code wie folgt geändert und es funktioniert!

Code: Alles auswählen

toplevel.attributes("-transparentcolor", "red")
toplevel.overrideredirect(1)

label_image.configure(bg = "red")
Vielen Dank, Problem gelöst.
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Oben genanntes funktioniert zwar, aber bei .png-Bildern mit halbtransparenten Pixeln werden diese rot angezeigt, wohl wegen label_image.configure(bg = "red").
Ich könnte damit leben, fände es aber natürlich schöner, weiche Übergange zu haben. Gibt es eine andere Möglichkeit, als die mit transparentcolor ?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Nicht das ich wüsste, selbst die transparentcolor ist mir schon neu :K

Wo hast du das gefunden ?
Vieleicht steht auf der entsprechenden Seite noch was hilfreiches.

Was passiert eigentlich, wenn du einfach mal "label_image.configure(bg = "red")" weg lässt ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
asdman3000
User
Beiträge: 17
Registriert: Donnerstag 1. April 2010, 15:05

Xynon1 hat geschrieben:Wo hast du das gefunden ?
Vieleicht steht auf der entsprechenden Seite noch was hilfreiches.
Hier: http://tcl.tk/man/tcl8.4/TkCmd/wm.htm#M13, ist glaub ich gar nicht spezifisch Tkinter, aber bei mir funktionierts.
Xynon1 hat geschrieben:Was passiert eigentlich, wenn du einfach mal "label_image.configure(bg = "red")" weg lässt ?
Dann hab ich dort wo die Bilder transparent sein sollten die Standard-Hintergrundfarbe hellgrau. Ich hab zum testen einfach rot genommen, weil es auf den Bildern nicht vorkommt und ein kurzes Wort ist :D
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

:K - tut mir leid da kann ich dir wirklich nicht mehr helfen.

Aber danke für den link, jetzt weiß ich warum es bei mir nie ging - ist nur für Windows :mrgreen:
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo asdman3000

Hast du so etwas wie folgt unter Windows schon ausprobiert?:

Code: Alles auswählen

import Tkinter as tk

app_win=tk.Tk()
app_win.geometry("200x200")

app_win.config(cursor="@aero_working.ani")

app_win.mainloop()
Die animierten Cursors findest du unter dem Pfad:
C:\Windows\Cursors
Kopiere die gewünschten Cursordatei in dein Arbeitsverzeichnis.

Gruss wuf :wink:
Take it easy Mates!
Antworten