Liebe alle,
ich bin in letzter Zeit damit beschäftigt, mich in tkinter einzuarbeiten und stoße dabei aber auf das Problem, dass ich bei hoffentlich richtiger Übernahme des Codes aus dem Python 3 Handbuch von Ernesti und Kaiser (6. Aufl., S. 862) trotzdem das Programm nicht starten kann. Nach einer Weile habe ich herausgefunden, dass es ausschließlich an den Zeilen 8 und 9 liegt. Es spielt keine Rolle, wie komplex ich den Datei-Pfad gestalte. Es scheint so, als könnte Python mit den Befehlen nicht umgehen...
import tkinter
class MyApp(tkinter.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.cv=tkinter.Canvas(self, width=800, height=600)
self.cv.pack()
self.img = tkinter.PhotoImage(file="Python.png")
self.cv.create_image(0, 0, image=self.img, anchor="nw")
root = tkinter.Tk()
app = MyApp(root)
app.mainloop()
Problem mit tkinter.PhotoImage
Hallo,
ich versuche gerade herauszufinden, was du für Probleme mit dem Code hast. Wenn ich den, mit einem beliebigen *.png - Bild, laufen lasse, dann erhalte ich keine Fehlermeldung und das Bild wird angezeigt.
Was bekommst du denn für eine (vollständige) Fehlermeldung? Oder was ist nicht so, wie du es gerne hättest?
Grüße
Dennis
ich versuche gerade herauszufinden, was du für Probleme mit dem Code hast. Wenn ich den, mit einem beliebigen *.png - Bild, laufen lasse, dann erhalte ich keine Fehlermeldung und das Bild wird angezeigt.
Was bekommst du denn für eine (vollständige) Fehlermeldung? Oder was ist nicht so, wie du es gerne hättest?
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Bitte Code in den dafür vorgesehenen Code Tags posten, damit die in Python relevanten Einrückungen erhalten bleiben.
Zu deinem Problem: es wird trotzdem ein Pfad-Problem sein. Mit
muss durchlaufen. Vorher kann PhotoImage nicht Hexen.
Zu deinem Problem: es wird trotzdem ein Pfad-Problem sein. Mit
Code: Alles auswählen
import pathlib
PATH = “Bild.png”
assert pathlib.Path(PATH).exists()
tkinter wird üblicherweise als tk abgekürzt. Ein Frame sollte sich nicht selbst im übergeordneten Widget platzieren. Es sollte eine main-Funktion geben. Variablennamen sollte man nicht abkürzen.
Ein My-Präfix ist sinnlos, weil es keinen Mehrwert bietet, kann also weg. Tkinter definiert einige Konstanten, die man nutzen sollte.
Du gibst den Pfad zum Bild relativ zum aktuellen Arbeitsverzeichnis an. Wahrscheinlich ist es nicht das Verzeichnis, in dem das Bild liegt. Üblicherweise gibt man Pfade, die hart im Code stehen, relativ zur Python-Datei an, und legt diese Dateien auch dann passend dazu ab.
Ein My-Präfix ist sinnlos, weil es keinen Mehrwert bietet, kann also weg. Tkinter definiert einige Konstanten, die man nutzen sollte.
Du gibst den Pfad zum Bild relativ zum aktuellen Arbeitsverzeichnis an. Wahrscheinlich ist es nicht das Verzeichnis, in dem das Bild liegt. Üblicherweise gibt man Pfade, die hart im Code stehen, relativ zur Python-Datei an, und legt diese Dateien auch dann passend dazu ab.
Code: Alles auswählen
import tkinter as tk
from pathlib import Path
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.canvas = tk.Canvas(self, width=800, height=600)
self.canvas .pack()
self.image = tk.PhotoImage(file=Path(__file__).parent / "Python.png")
self.canvas .create_image(0, 0, image=self.image, anchor=tk.NW)
def main():
root = tk.Tk()
app = App(root)
app.pack()
app.mainloop()
if __name__ == "__main__":
main()
-
- User
- Beiträge: 80
- Registriert: Samstag 25. April 2020, 19:03
Hallo Sirus3,Sirius3 hat geschrieben: ↑Freitag 12. Mai 2023, 08:23 tkinter wird üblicherweise als tk abgekürzt. Ein Frame sollte sich nicht selbst im übergeordneten Widget platzieren. Es sollte eine main-Funktion geben. Variablennamen sollte man nicht abkürzen.
Ein My-Präfix ist sinnlos, weil es keinen Mehrwert bietet, kann also weg. Tkinter definiert einige Konstanten, die man nutzen sollte.
Du gibst den Pfad zum Bild relativ zum aktuellen Arbeitsverzeichnis an. Wahrscheinlich ist es nicht das Verzeichnis, in dem das Bild liegt. Üblicherweise gibt man Pfade, die hart im Code stehen, relativ zur Python-Datei an, und legt diese Dateien auch dann passend dazu ab.
Code: Alles auswählen
import tkinter as tk from pathlib import Path class App(tk.Frame): def __init__(self, master): super().__init__(master) self.canvas = tk.Canvas(self, width=800, height=600) self.canvas .pack() self.image = tk.PhotoImage(file=Path(__file__).parent / "Python.png") self.canvas .create_image(0, 0, image=self.image, anchor=tk.NW) def main(): root = tk.Tk() app = App(root) app.pack() app.mainloop() if __name__ == "__main__": main()
wenn ich den Code anwende wird nur ein Ausschnitt des Bildes dargestellt. Wieso wird das Bild nicht auf die im Code angegebene Größe skaliert?
VG
Nino
-
- User
- Beiträge: 80
- Registriert: Samstag 25. April 2020, 19:03
- __blackjack__
- User
- Beiträge: 13931
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@NinoBaumann: Das beantwortet nicht wirklich die Frage warum Du denkst es sollte auf den sichtbaren Bereich skaliert werden. Wird es halt nicht. Würde es das, müsste es ja auch einen dokumentierten Weg geben das *nicht* zu skalieren, wenn man das nicht haben will.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
-
- User
- Beiträge: 5
- Registriert: Donnerstag 11. Mai 2023, 17:40
Das funktioniert. Vielen Dank dafür!Sirius3 hat geschrieben: ↑Freitag 12. Mai 2023, 08:23 tkinter wird üblicherweise als tk abgekürzt. Ein Frame sollte sich nicht selbst im übergeordneten Widget platzieren. Es sollte eine main-Funktion geben. Variablennamen sollte man nicht abkürzen.
Ein My-Präfix ist sinnlos, weil es keinen Mehrwert bietet, kann also weg. Tkinter definiert einige Konstanten, die man nutzen sollte.
Du gibst den Pfad zum Bild relativ zum aktuellen Arbeitsverzeichnis an. Wahrscheinlich ist es nicht das Verzeichnis, in dem das Bild liegt. Üblicherweise gibt man Pfade, die hart im Code stehen, relativ zur Python-Datei an, und legt diese Dateien auch dann passend dazu ab.
Code: Alles auswählen
import tkinter as tk from pathlib import Path class App(tk.Frame): def __init__(self, master): super().__init__(master) self.canvas = tk.Canvas(self, width=800, height=600) self.canvas .pack() self.image = tk.PhotoImage(file=Path(__file__).parent / "Python.png") self.canvas .create_image(0, 0, image=self.image, anchor=tk.NW) def main(): root = tk.Tk() app = App(root) app.pack() app.mainloop() if __name__ == "__main__": main()
Um nun das Bild auf die Größe des Canvas zu reduzieren, müsste ich die resize-Option von pillow nutzen. Ich habe im Folgenden einen Code eingefügt, der genau das machen soll. Bloß werde ich mal wieder damit gestraft, dass sich mein Programm damit nicht öffnen lässt...
Code: Alles auswählen
import tkinter as tk
from PIL import Image, ImageTk
from pathlib import Path
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.canvas = tk.Canvas(self, width=800, height=800)
self.canvas.pack()
self.bild = Image.open(file=Path(r"C:\Users\xyz\Downloads\Python.png").parent/"Python.png")
self.bild_verändert= self.bild.resize(width=800, height=800, Image.ANTIALIAS)
self.bild_neu= ImageTk.PhotoImage(self.bild_verändert)
self.canvas.create_image(0, 0, anchor="nw", image=self.bild_neu)
def main():
root = tk.Tk()
app = App(root)
app.pack()
app.mainloop()
if __name__ == "__main__":
main()
Geht es so?
Code: Alles auswählen
self.bild = Image.open(r"C:\Users\xyz\Downloads\Python.png")
self.bild_verändert= self.bild.resize([800, 800], Image.ANTIALIAS)
OS: LMDE5 *** Homepage *** Github Seite
-
- User
- Beiträge: 5
- Registriert: Donnerstag 11. Mai 2023, 17:40
Leider auch nicht.Axel-WAK hat geschrieben: ↑Freitag 12. Mai 2023, 19:05 Geht es so?
Code: Alles auswählen
self.bild = Image.open(r"C:\Users\xyz\Downloads\Python.png") self.bild_verändert= self.bild.resize([800, 800], Image.ANTIALIAS)
Fehlermeldungen wären vielleicht hifreich.
Gibt es die Datei C:\Users\xyz\Downloads\Python.png überhaupt.
Bei mir funktioniert das mit einer existierenden Datei.
Gibt es die Datei C:\Users\xyz\Downloads\Python.png überhaupt.
Bei mir funktioniert das mit einer existierenden Datei.
OS: LMDE5 *** Homepage *** Github Seite
-
- User
- Beiträge: 5
- Registriert: Donnerstag 11. Mai 2023, 17:40
Es war immer noch ein Pfadproblem, das ich aber schlussendlich lösen konnte. Vielen Dank für die hilfreichen Ratschläge!
-
- User
- Beiträge: 80
- Registriert: Samstag 25. April 2020, 19:03
Wenn man eine Lösung findet dann schreibt man diese auch normalerweise in den Beitrag rein damit andere mit demselben Problem eine Lösung haben.DerBotaniker hat geschrieben: ↑Montag 15. Mai 2023, 07:32 Es war immer noch ein Pfadproblem, das ich aber schlussendlich lösen konnte. Vielen Dank für die hilfreichen Ratschläge!
-
- User
- Beiträge: 5
- Registriert: Donnerstag 11. Mai 2023, 17:40
Die Lösung wurde bereits weiter oben angesprochen. Mein Bild befand sich bloß im falschen Ordner. Nachdem ich es parallel zum Python-Arbeitsverzeichnis angelegt hatte lief alles gut.NinoBaumann hat geschrieben: ↑Montag 15. Mai 2023, 13:39Wenn man eine Lösung findet dann schreibt man diese auch normalerweise in den Beitrag rein damit andere mit demselben Problem eine Lösung haben.DerBotaniker hat geschrieben: ↑Montag 15. Mai 2023, 07:32 Es war immer noch ein Pfadproblem, das ich aber schlussendlich lösen konnte. Vielen Dank für die hilfreichen Ratschläge!