Python Imports überschreiben sich?


22.03.2022, 20:12

Die genaue Fehlermeldung wenn ich beide Importiert habe ist:

_tkinter.TclError: image "pyimage1" doesn't exist

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

DieLeertaste 
Fragesteller
 23.03.2022, 13:55

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

0
regex9  23.03.2022, 14:20
@DieLeertaste

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()
0
DieLeertaste 
Fragesteller
 23.03.2022, 14:22
@regex9

Ich meine es muss doch eine Möglichkeit geben das sich das root Fenster schließt wenn man ein neues öffnet

0
regex9  23.03.2022, 14:41
@DieLeertaste

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()
0

schon mal den import umgedreht . scheint ja das eine macht probleme . ist die selbst erstellt ? funktioniert die sauber ?

DieLeertaste 
Fragesteller
 22.03.2022, 20:24

Import umdrehen führt zum gleichen ergebnis

0
DieLeertaste 
Fragesteller
 22.03.2022, 21:17
@DieLeertaste

Also der Import meiner eigenen Datei blockiert quasi dein Import von Tkinter die frage ist nur warum

0
DieLeertaste 
Fragesteller
 22.03.2022, 21:19
@TechPech1984

Ich hab die Datei mal seperat ausgeführt funktioniert alles gut und ohne Fehler (ist bis jetzt auch kaum etwas)

0
TechPech1984  22.03.2022, 21:26
@DieLeertaste

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.

0
DieLeertaste 
Fragesteller
 22.03.2022, 21:31
@TechPech1984

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

0