Python Imports überschreiben sich?
Ich habe einen etwas komischen Fehler ich brauche für mein Python Projekt einmal Tkinter und eine Datei die im gleichen Verzeichnis liegt also importiere ich diese beide ich habe zuerst Tkinter und dann meine Datei importiert also:
Import tkinter as tk
Import "meine Datei" as "Abkürzung für meine Datei"
nur sobald ich eine Funktion von Tkinter benutzen will existiert diese angeblich nicht bzw. in meinem Fall ist es die Funktion PhotoImage sobald ich allerdings denn Import meiner Datei entferne funktioniert alles perfekt
Die genaue Fehlermeldung wenn ich beide Importiert habe ist:
_tkinter.TclError: image "pyimage1" doesn't exist
2 Antworten
Die Fehlermeldung weist daraufhin, dass tkinter versucht, ein Bild anzuzeigen, welches nicht (mehr) existiert oder dem falschen Root zugeordnet wurde.
1) Stelle sicher, dass du nur ein Root-Fenster hast. Wenn du weitere Fenster brauchst, erstelle sie bspw. mit
new_window = tk.Toplevel()
2) Prüfe, ob das Bild im Speicher verbleibt. Eine Referenz darauf sollte genügen (normalerweise hat man ja ein Label/o.ä., dem das Bild zur Anzeige überreicht wird). Wenn du im Verlauf deines Skripts die Referenz jedoch überschreiben (bzw. den Referenzträger entfernen) solltest, wird das Bild früher oder später vom GC abgeräumt.
Das Problem kann ich gerade nicht nachvollziehen. Du hast doch sicherlich ein Hauptfenster, welches einen Button enthält. Dieser bekommt einen Command, der auf eine Funktion zeigt, in der das neue Fenster mitsamt Bild angelegt wird:
import tkinter as tk
def open():
window = tk.Toplevel()
image = tk.PhotoImage(file="...")
label = tk.Label(window, image=image)
label.pack()
root = tk.Tk()
button = tk.Button(root, text="Click me", command=open)
button.pack()
root.mainloop()
Ich meine es muss doch eine Möglichkeit geben das sich das root Fenster schließt wenn man ein neues öffnet
Dafür braucht es nur ein paar Anpassungen. Setze den Status des Rootfensters auf withdraw und hänge dich an das Event, welches gefeuert wird, wenn du das Toplevel-Fenster schließt.
def open():
window = tk.Toplevel()
root.withdraw()
window.protocol("WM_DELETE_WINDOW", exit_app)
In exit_app beendest du die Anwendung:
def exit_app():
root.destroy()
schon mal den import umgedreht . scheint ja das eine macht probleme . ist die selbst erstellt ? funktioniert die sauber ?
Also der Import meiner eigenen Datei blockiert quasi dein Import von Tkinter die frage ist nur warum
Ich hab die Datei mal seperat ausgeführt funktioniert alles gut und ohne Fehler (ist bis jetzt auch kaum etwas)
ich kenne mich in python nicht aus , was man alles machen muss um dinge zu importieren , aber ich kenne das aus anderen sprachen und wenn man das nicht korrekt macht , erzeugt man halt problem . ergo wenn es um namensräume geht oder irgendwas nicht richtig gekapselt etc . in java z.b. mehrere main functionenen .
musst du schon einen profi fragen ob deine import datei so korrekt ist für import .
die erste einsicht wäre mal bei dir, das du das problem erzeugst mit deiner datei und nicht "die anderen sind schuld" spielst.
In Python muss man in denn Dateien nichts spezielles machen um diese in anderen zu importieren und in der Datei ist kein Fehler da die Datei ja normal durchlauft
und wie kann ich dann verhindern dass das Fenster sich auch öffnet ich will das sich dieses Fenster erst öffnet wenn man einen Button drückt