JPEG Bild in Python als Hintergrund einfügen

Fragen zu Tkinter.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Ich habe die Aufgabe ein spiel zu programmieren in dem man eine Turtle durch ein Labyrinth steuert. Ich habe mir mit Gimp eine JPEG Datei erstellt um die pixel werte auszulesen und mit dem der Turtle abzugleichen. (Ob das funktioniert weiß ich noch nicht)
In der Schule haben wir gelernt wie man GIFs in den Hintergrund einfügt. Da ich aber ein JPEG habe ist das problematisch. Ich konnte aherausfinden das ich Tkinter benutzen muss, doch aus den Codes die ich finde werde ich nicht schlau. Meine Aufgabe ist es meine Shcritte erklären zu können also falls es geht nicht so kompliziert.
LG Freddy
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum ist das mit einem JPEG problematisch? Was ist der Unterschied zwischen GIF und JPEG?
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Wir haben immer folgenden Code verwende:

Code: Alles auswählen

bs=Screen()
bs.register_shape("xxx.gif")
bs.bgpic("xxx.gif")
Damit funktoniert GIF zwar aber bei JPEG Datei ist das nicht möglich.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Niemand hier weiß, was bs ist. Entweder klärst du uns auf, oder du wandelst dein JPEG in ein GIF & gut ist.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Vllt könnstest du ja meine Frage richtig lesen. JPEG in GIF umwandeln ist keine Lösung für mein Problem. Meine Frage war eigentlich nur wie ich JPEGs bei PYTHON in den Hintergrund bekomme. Jetzt sind wir dabei angelangt zu diskutieren was bs ist usw. Das ist nur leider irrelevant für mein Problem. Falls ihr mir helfen wollt dann könnt ihr mir ja vllt verraten wie das funktioniert oder OB das überhaupt funktioniert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Achso, ist also mein Fehler, dass du nicht sagst, dass du JPEGS zwingend brauchst (lese ich nirgendwo in deiner Frage, da steht nur du hast eines), und das ich nicht aus 3 Zeilen Code ohne Kontext magisch erraten kann, was genau dieses bs ist, welches du benutzt.

Wenn du mal deinen Browser bemuehst (du hast ja einen, um hier zu posten) und im Suchfeld "tkinter jpeg" eingibst, dann bist du nicht auf uns hier angewiesen, und kannst dir in Zukunft einfach deine Fragen selbst beantworten, ok?

Das ein JPEG eine Scheiss-Idee ist fuer ein Spiel bei dem man praeziese Positionen aus einer Grafik ableiten will, weil es durch Kompressionsartefakte unscharf wird,ist ein kleiner Gratishinweis zum Abschied.
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Abschließend zu dieser Diskussion möchte ich noch ein paar Dinge klarstellen. Ich kann nämlich sehen das ich mich nicht sonderlich klar geäußert habe bzw. einige Angaben vergessen habe. Allerdings bin ich der Meinung das man meine Frage aus dem Text herauslesen kann und der Rest nur kleine und unwichtige erklärungen sind. Ihre aussagen sind leider allesamt auf "bs" und "gif" bezogen. In restlichen Teil ihrer beiträge, die mir nicht geholfen haben mein Problem zu lösen, geben sie leider nur unnützes Zeug von sich. Meine Frage, wie ich mit TKinter JPEG Dateien in den Hintergrund setzen kann, haben sie leider Ignoriert. Anstatt mir zu sagen das sie nicht mehr Ahnung von Tkinter haben als ich, mussten sie auf schlau machen.Ich hoffe das sie in ihrem nächsten Kommentar Kompetenz beweisen können. Denn leider wurde ich das erstemal von einem Forenmitglied entäuscht. Selbst bei gutefrage.net hatte ich noch nie einen so inkompetenten und unhöfflichen User wie sie. Ich wünsche ihnen noch ein schönes Wochenende.
MFG Freddy
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Freddyyy

Die fogenden drei Zeilen:
bs=Screen()
bs.register_shape("xxx.gif")
bs.bgpic("xxx.gif")
interpretiere ich wie folgt:

a)
bs=Screen()
Du erstellst eine Oberfläche(Fenster) um darauf ein Hintergrundbild zu platzieren.
b)
bs.bgpic("xxx.gif")
Ist das Hintergrundbild im .gif-Format, welches du auf dieser Oberfläche platzieren willst.
c)
bs.register_shape("xxx.gif")
Ist das Symbolbild für deine Turtle im .gif-Format, welche du auf deinem Hintergrundbild platzieren möchtest.
d)
Die .gif's willst du durch .jpeg's ersetzen und das ganze mit einem Tkinter-Skript realisieren.

Damit Tkinter mit .jpeg's umgehen kann braucht er hierfür das PIL-Modul. Das folgende Skript zeigt eine Variante wie dass ganze mit Tkinter aufgesetzt werden könnte:

Code: Alles auswählen

import tkinter as tk
from PIL import Image, ImageTk

APP_TITLE = "JPEG-Hintergrund"

app_win = tk.Tk()
app_win.title(APP_TITLE)

# Erzeugt das Hintegrund PIL-Bildobjekt 
pil_background_image = Image.open("hintergrund.jpg")
# Konvertiert das Hintegrund PIL-Bildobjekt zum Tk-Bildobjekt
app_win.tk_background_image = ImageTk.PhotoImage(pil_background_image)

# Erzeugt das Turtle PIL-Bildobjekt
pil_turtle_image = Image.open("turtle.jpg")
# Konvertiert das Turtle PIL-Bildobjekt zum Tk-Bildobjekt
app_win.tk_turtle_image = ImageTk.PhotoImage(pil_turtle_image)

# Abmessungen des Hintergrundbildes
width = app_win.tk_background_image.width()
height = app_win.tk_background_image.height()

# Erzeuge Bildfläche für das ablegen des Hintergrundbildes
canvas = tk.Canvas(app_win, width=width, height=height, highlightthickness=0)
canvas.pack()

# Legt das Hintegrundbild auf die Bildfläche
canvas.create_image(0, 0, image=app_win.tk_background_image, anchor='nw',
    tag="Hintergrund")
    
# Lege die Turle auf das Hintergrundbild
canvas.create_image(10, 10, image=app_win.tk_turtle_image, anchor='nw',
    tag="Turtle")

app_win.mainloop()
Grus wuf :wink:
Take it easy Mates!
Astorek
User
Beiträge: 72
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Freddyyy hat geschrieben:Vllt könnstest du ja meine Frage richtig lesen. JPEG in GIF umwandeln ist keine Lösung für mein Problem. Meine Frage war eigentlich nur wie ich JPEGs bei PYTHON in den Hintergrund bekomme.
Ich antworte jetzt mal bewusst so, wie man sonst in den frühen Nullerjahren in einem Forum darauf geantwortet hätte:

Dann mach nächstes Mal verdammtnochmal klar, dass du (aus welchen Gründen auch immer) dein JPEG-Bild nicht in ein GIF-Bild umwandeln kannst oder willst. Woher sollen andere das wissen, dass das bei dir (wie gesagt: Aus welchen Gründen auch immer, sei dir überlassen) nicht zur Lösung beiträgt? Und dann noch die Beleidigte Leberwurst spielen, weil statt einer angedachten eine alternative Lösung präsentiert wurde, von der vorher nicht klar war, dass sie bei dir (aus. welchen. Gründen. auch. immer.) nicht beiträgt.

Ernsthaft, woher kommt eigentlich die in letzter Zeit vermehrt auftretende Einstellung von manchem Fragesteller (nicht speziell hier im Forum bezogen, aber in anderen Programmierforen erlebe ich das auch zunehmend öfters), gleich die Frust in Richtung Helfer abzulassen? Glücklicherweise sind nicht alle Fragensteller so drauf, ansonsten hätte ich längst die Lust verloren, mich überhaupt helfend in einem Forum zu beteiligen.

Aber umgekehrt erwarten, dass einem sämtliche relevanten Infos aus der Nase gezogen werden... Ne, echt nicht. Es ist Aufgabe des Fragestellers, wenigstens alle kontextbezogenen Infos zu liefern bei dem Problem, was er gern gelöst haben möchte. Wer sich ernsthaft beleidigt fühlt, dass er einen Quellcode postet dessen verwendeten Module nicht ersichtlich sind und deswegen (wie Sirius3) nachfragen muss, braucht sich nicht zu wundern, wenn die Antworten entsprechend ausfallen. Mann mann mann...

(An der Stelle bin ich gespannt, ob sich jemand im "Tonfall/Stil der Antworten"-Thread melden wird...)

EDIT: Eines noch:
Freddyyy hat geschrieben:Allerdings bin ich der Meinung das man meine Frage aus dem Text herauslesen kann und der Rest nur kleine und unwichtige erklärungen sind.
Sind sie nicht. Nur um das mal unmissverständlich gesagt zu haben.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Vielleicht ist es wieder Zeit, auf einen Klassiker hinzuweisen:
http://www.catb.org/esr/faqs/smart-questions.html

Gibt es auch auf deutsch:
https://tty1.net/smart-questions_de.html
ebs55
User
Beiträge: 17
Registriert: Sonntag 29. April 2018, 14:27

Zu:
Freddyyy hat geschrieben:Abschließend zu dieser Diskussion möchte ich noch ein paar Dinge klarstellen. Ich kann nämlich sehen das ich mich nicht sonderlich klar geäußert habe bzw. einige Angaben vergessen habe. Allerdings bin ich der Meinung das ...inkompetenten ... und unhöfflichen User ...
MFG Freddy
So viel Unqualifiziertes habe ich glücklicherweise ganz lange nicht mehr gelesen ! :oops:
Das ist ja richtig beschämend - aber nur für DICH.

Du bist ganz sicher derjenige, auf den DEINE Attribute "inkompetenten ... und unhöfflich"
am besten zutreffen.

Ich hoffe, dass du dem Rat von kbr gefolgt bist - und dort vielleicht sogar etwasgelernt hast:
"Vielleicht ist es wieder Zeit, auf einen Klassiker hinzuweisen:
http://www.catb.org/esr/faqs/smart-questions.html"
Freddyyy
User
Beiträge: 69
Registriert: Donnerstag 26. April 2018, 17:50

Im nachhinein muss ich mich entschuldigen, dafür das ich mich nicht angemessen verhalten habe.
Trotzdem Danke das mir wuf noch geholfen hat. Bin wohl etwas andere umstände gewohnt.
(wuf hat aber im übrigen mein anliegen verstanden)
hlech65730
User
Beiträge: 9
Registriert: Samstag 10. Februar 2018, 19:28

Hallo @all,

ich habe ein ähnliches Problem mit den .jpegs, das Modul PIL kennt aber mein Mac nicht :
Traceback (most recent call last):
File "Class_Schalter_Tkinter_Mac_F1.py", line 6, in <module>
from PIL import Image, ImageTk
ImportError: No module named PIL


------------------
(program exited with code: 1)
Press return to continue

kann mir jemand verraten, wo ich das her bekomme ?
Vielen Dank ! H.Lech
Astorek
User
Beiträge: 72
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Es gibt ein Paket namens "Pillow", was sich mit dem "pip"-Befehl, der bei der Python-Installation mitgeliefert wird, ganz leicht installieren lassen soll:

Code: Alles auswählen

pip install Pillow
(Achtung: Groß-/Kleinschreibung ist hier wichtig; nicht "pillow", sondern "Pillow" (großes P))
Evtl. muss das in einem Befehlszeilenfenster mit erhöhten Rechten eingegeben werden (so wie unter Windows mit Administratorrechten; ich kenne mich mit Macs leider nicht aus, finde in Google aber überall dieses Ergebnis...)
hlech65730
User
Beiträge: 9
Registriert: Samstag 10. Februar 2018, 19:28

Hallo Astorek,

danke ! Hilft mir schon weiter ! Außerdem habe ich noch Python unter Raspbian, da kann ich das so verwenden.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

wuf hat geschrieben: Samstag 28. April 2018, 11:46 Hi Freddyyy

Die fogenden drei Zeilen:
bs=Screen()
bs.register_shape("xxx.gif")
bs.bgpic("xxx.gif")
interpretiere ich wie folgt:

a)
bs=Screen()
Du erstellst eine Oberfläche(Fenster) um darauf ein Hintergrundbild zu platzieren.
b)
bs.bgpic("xxx.gif")
Ist das Hintergrundbild im .gif-Format, welches du auf dieser Oberfläche platzieren willst.
c)
bs.register_shape("xxx.gif")
Ist das Symbolbild für deine Turtle im .gif-Format, welche du auf deinem Hintergrundbild platzieren möchtest.
d)
Die .gif's willst du durch .jpeg's ersetzen und das ganze mit einem Tkinter-Skript realisieren.

Damit Tkinter mit .jpeg's umgehen kann braucht er hierfür das PIL-Modul. Das folgende Skript zeigt eine Variante wie dass ganze mit Tkinter aufgesetzt werden könnte:

Code: Alles auswählen

import tkinter as tk
from PIL import Image, ImageTk

APP_TITLE = "JPEG-Hintergrund"

app_win = tk.Tk()
app_win.title(APP_TITLE)

# Erzeugt das Hintegrund PIL-Bildobjekt 
pil_background_image = Image.open("hintergrund.jpg")
# Konvertiert das Hintegrund PIL-Bildobjekt zum Tk-Bildobjekt
app_win.tk_background_image = ImageTk.PhotoImage(pil_background_image)

# Erzeugt das Turtle PIL-Bildobjekt
pil_turtle_image = Image.open("turtle.jpg")
# Konvertiert das Turtle PIL-Bildobjekt zum Tk-Bildobjekt
app_win.tk_turtle_image = ImageTk.PhotoImage(pil_turtle_image)

# Abmessungen des Hintergrundbildes
width = app_win.tk_background_image.width()
height = app_win.tk_background_image.height()

# Erzeuge Bildfläche für das ablegen des Hintergrundbildes
canvas = tk.Canvas(app_win, width=width, height=height, highlightthickness=0)
canvas.pack()

# Legt das Hintegrundbild auf die Bildfläche
canvas.create_image(0, 0, image=app_win.tk_background_image, anchor='nw',
    tag="Hintergrund")
    
# Lege die Turle auf das Hintergrundbild
canvas.create_image(10, 10, image=app_win.tk_turtle_image, anchor='nw',
    tag="Turtle")

app_win.mainloop()
Grus wuf :wink:
Huhu,
ich habe mir mal dieses Programm abgetippt, das ist auch für mich nützlich ^^
so, aber ich habe versucht zum testen einen button drauf zu legen, mein ganzer Code (er ist einfacher gemacht als der oben) sieht dann so aus:

Code: Alles auswählen

import tkinter as tk
from PIL import Image, ImageTk


APP_TITLE = "JPEG-Hintergrund"

app_win = tk.Tk()
app_win.title(APP_TITLE)

pil_background_image = Image.open("talion.jpg")
app_win.tk_background_image = ImageTk.PhotoImage(pil_background_image)

width = app_win.tk_background_image.width()
height = app_win.tk_background_image.height()

canvas = tk.Canvas(app_win, width=width, height=height, highlightthickness=0)
canvas.pack()

canvas.create_image(0, 0, image=app_win.tk_background_image, anchor='nw', tag="Hintertgrund")


def Test():
    messagebox.showinfo(message="Test!")

button = Button(app_win, text="Testen!", command=Test, height = 10, width = 20)
button.pack()


app_win.mainloop()
Wenn ich das jetzt starte, kommt aber als Ausgabe ein Error mit "Button" is not defined...
Jemand ne Ahnung warum???
wenn ich am Anfang des Programms, so kenns ich von früher, einfach hinschreibe "from tkinter import *" kommt als Fehlercode raus AttributeError: type object 'Image' has no attribute 'open'
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Button ist aus tkinter, und das wird als tk importiert. Du musst also tk.Button schreiben. Und Sternchenimporte sollte man genau aus dem Grund vermeiden, den du gerade erlebst: das Modul tkinter enthaelt eine Klasse Image. Das ist aber eine ganz andere als die, die du brauchst, und die aus PIL kommt. Aber durch deinen ueberbuegelnden import ist dir das nicht aufgefallen, und du importierst die falsche Klasse.

Darum NIEMALS

Code: Alles auswählen

  from irgendwas import *
machen! Sondern immer explizit was du brauchst importieren. Das kann man dann auch zur Not umbenennen. Zb

Code: Alles auswählen

 from tkinter import Image as tkImage
wenn es sein muss. Allerdings ist der

Code: Alles auswählen

 import tkinter as tk
Ansatz ehr besser.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

__deets__ hat geschrieben: Freitag 18. Mai 2018, 15:31 Button ist aus tkinter, und das wird als tk importiert. Du musst also tk.Button schreiben. Und Sternchenimporte sollte man genau aus dem Grund vermeiden, den du gerade erlebst: das Modul tkinter enthaelt eine Klasse Image. Das ist aber eine ganz andere als die, die du brauchst, und die aus PIL kommt. Aber durch deinen ueberbuegelnden import ist dir das nicht aufgefallen, und du importierst die falsche Klasse.

Darum NIEMALS

Code: Alles auswählen

  from irgendwas import *
machen! Sondern immer explizit was du brauchst importieren. Das kann man dann auch zur Not umbenennen. Zb

Code: Alles auswählen

 from tkinter import Image as tkImage
wenn es sein muss. Allerdings ist der

Code: Alles auswählen

 import tkinter as tk
Ansatz ehr besser.
Ahh vielen Dank, ich mach das mit den * eh nur weil ich des in so vielen Tutorials zu tkinter lese, aber dann machs ich jetzt präziser!


Aber nichts desto trotz, auch mit tk.Button klappts nicht...zwar sind die Error jetzt weg, aber der Button wird immer noch nicht angezeigt... hier nochma der überarbeitete code:

Code: Alles auswählen

import tkinter as tk
from PIL import Image, ImageTk
from tkinter import messagebox



APP_TITLE = "JPEG-Hintergrund"

app_win = tk.Tk()
app_win.title(APP_TITLE)

pil_background_image = Image.open("talion.jpg")
app_win.tk_background_image = ImageTk.PhotoImage(pil_background_image)

width = app_win.tk_background_image.width()
height = app_win.tk_background_image.height()

canvas = tk.Canvas(app_win, width=width, height=height, highlightthickness=0)
canvas.pack()

canvas.create_image(0, 0, image=app_win.tk_background_image, anchor='nw', tag="Hintertgrund")


def Test():
    messagebox.showinfo(message="Test!")

button = tk.Button(app_win, text="Testen!", command=Test, height = 1, width = 12)
button.pack()
button.config(background='white', foreground='white')


app_win.mainloop()
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Phobit

Funktioniert es so besser?:

Code: Alles auswählen

import tkinter as tk
from PIL import Image, ImageTk
from tkinter import messagebox



APP_TITLE = "JPEG-Hintergrund"

app_win = tk.Tk()
app_win.title(APP_TITLE)

pil_background_image = Image.open("talion.jpg")
app_win.tk_background_image = ImageTk.PhotoImage(pil_background_image)

width = app_win.tk_background_image.width()
height = app_win.tk_background_image.height()

canvas = tk.Canvas(app_win, width=width, height=height, highlightthickness=0)
canvas.pack()

canvas.create_image(0, 0, image=app_win.tk_background_image, anchor='nw', tag="Hintertgrund")


def Test():
    messagebox.showinfo(message="Test!")

button = tk.Button(app_win, text="Testen!", command=Test, height = 1, width = 12)
button.config(background='white', foreground='white')
canvas.create_window(20, 20, window=button, anchor='nw')

app_win.mainloop()
Gruss wuf ;-)
Take it easy Mates!
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

wenn man de Foreground des buttons auf weiß ändert, damit man ihn auch lesen kann ja ;)
super, danke!
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten