@thorsten160970: Die Links/Rechts-Aufteilung dürfte der Grund sein warum die Schaltfläche verschwindet — nämlich *hinter* dem Links angezeigten Bild. `place()` ist keine gute Idee und bei `pack()` sollte man sich innerhalb eines Container-Widgets auf *einen* Wert für alle darin angeordneten Widgets beschränken. Sonst wird es schnell schwierig das Verhalten der UI vorherzusagen.
Das Problem mit dem geladenen Bild ist, dass man auf Python-Seite eine Referenz darauf behalten muss, denn Python hat keine Ahnung ob das auf Tk-Seite noch benötigt wird und räumt das Objekt sonst aus dem Speicher. Also wenn `bild` nach Ablauf der `buttonNullClick()`-Funktion nicht mehr vorhanden ist.
Bei GUI-Programmierung kommt man um objektorientierte Programmierung (OOP) in Python nicht wirklich herum, und so löst man das dann in der Regel auch: das Bild an das Objekt binden das die GUI, beziehungsweise den GUI-Teil, modelliert.
Bild in Tkinter wird nicht angezeigt
@thorsten160970: Du hast das Problem nur auf einen anderen/weiteren Namen verschoben. Sowohl `bild` als auch `logo` existieren nach Abarbeitung der `buttonNullClick()`-Funktion nicht mehr. Im ersten Code war es nur `bild`. Man muss das Bild an etwas binden was die Funktionsabarbeitung ”überlebt” und das ist normalerweise ein Fall für OOP wo man das Bild dann an das Objekt bindet auf dem die Methoden aufgerufen wurde.
Auf Modulebene steht üblicherweise auch nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht in der Regel in einer Funktion die `main()` heisst und nur aufgerufen wird, wenn das Modul als Programm ausgeführt wird, aber nicht wenn es als Modul importiert wird. Das erreicht man mit folgendem Idiom:
Auf Modulebene steht üblicherweise auch nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht in der Regel in einer Funktion die `main()` heisst und nur aufgerufen wird, wenn das Modul als Programm ausgeführt wird, aber nicht wenn es als Modul importiert wird. Das erreicht man mit folgendem Idiom:
Code: Alles auswählen
if __name__ == '__main__':
main()
-
- User
- Beiträge: 26
- Registriert: Sonntag 1. September 2019, 15:32
Hallo,
Habe das selbe Problem.
Bei diesem Code funktioniert das ganze aber:
Hoffe mir kann jemand helfen.
Der_Scripter
Habe das selbe Problem.
Code: Alles auswählen
from Tkinter import *
class fenster():
def __init__(self):
self.root = Tk()
self.root.title("")
self.root["background"]="#E6E6E6"
self.root.iconbitmap(r"[i]Dateipfad[/i]")
self.root.resizable(False, False)
self.root.wm_geometry("%dx%d" % (613,445))
self.root.wm_geometry("+%d+%d" % (330,257))
self.bild()
self.root.mainloop()
def bild(self):
bild = PhotoImage(file="[i]GIFdatei[/i].gif")
self.Label3 = Label(self.root, image=bild)
self.Label3.place(x = 190, y = 130)
f = fenster()
Code: Alles auswählen
from Tkinter import *
tk = Tk()
tk.title("Foto")
canvas = Canvas(tk, width=800, height=400)
canvas.pack()
foto = PhotoImage(file=("[i]GIFdatei[/i].gif"))
canvas.create_image(0,0,anchor=NW, image=foto)
tk.mainloop()
Der_Scripter
Python ist Cool!
Wenn Du das selbe Problem hast, kannst Du ja auch die selbe Lösung verwenden:
- Verwende Python3, statt Python2
- Keine *-Importe, tkinter wird üblicherweise als `import tkinter as tk` eingebunden und alle Namen über tk.xyz angesprochen.
- Klassen schreibt man nach Konvention mit Großem AnfangsBuchstaben.
- __init__ sollte eine Instanz initialisieren, und dann zurückkehren und nicht niemals zurückkehren. mainloop gehört da nicht rein.
- Methodennamen sollten Tätigkeiten ausdrücken, `bild` ist keine. Die Methode an sich ist auch unsinnig, da das, was da drinsteht nach __init__ gehört.
Zum Code:
- Verwende Python3, statt Python2
- Keine *-Importe, tkinter wird üblicherweise als `import tkinter as tk` eingebunden und alle Namen über tk.xyz angesprochen.
- Klassen schreibt man nach Konvention mit Großem AnfangsBuchstaben.
- __init__ sollte eine Instanz initialisieren, und dann zurückkehren und nicht niemals zurückkehren. mainloop gehört da nicht rein.
- Methodennamen sollten Tätigkeiten ausdrücken, `bild` ist keine. Die Methode an sich ist auch unsinnig, da das, was da drinsteht nach __init__ gehört.
-
- User
- Beiträge: 26
- Registriert: Sonntag 1. September 2019, 15:32
1. Wir haben in der Schule nur Python 2 und ich möchte nicht jedesmal die Syntax ändern.
Und die restlichen Fehler: Ok ich bin noch Anfänger. Habe auch nicht den ganzen sondern nur den relevanten Teil des Programms geschickt.
Deshalb auch die Funktion. Das Problem(das habe ich öfter wäre über eine elegante Lösung froh) ist, dass ich das Fenster ändern und wieder zurückändern will. Also destroy() ich alles und gestalte es neu. Dan nach kann ich __init__ nicht mehr aufrufen, weil sich sonst ein neues Fenster öffnet.
Habe das Bild jetzt in die __init__ getan, wo es auch angezeigt wird. Aber wenn ich jetzt das was (oben nicht aber bei mir schon) aufrufen will, wie erzeuge ich das Bild dann wieder. Oder sollte ich es zwischendurch unsichtbar machen?
Und die restlichen Fehler: Ok ich bin noch Anfänger. Habe auch nicht den ganzen sondern nur den relevanten Teil des Programms geschickt.
Deshalb auch die Funktion. Das Problem(das habe ich öfter wäre über eine elegante Lösung froh) ist, dass ich das Fenster ändern und wieder zurückändern will. Also destroy() ich alles und gestalte es neu. Dan nach kann ich __init__ nicht mehr aufrufen, weil sich sonst ein neues Fenster öffnet.
Habe das Bild jetzt in die __init__ getan, wo es auch angezeigt wird. Aber wenn ich jetzt das was (oben nicht aber bei mir schon) aufrufen will, wie erzeuge ich das Bild dann wieder. Oder sollte ich es zwischendurch unsichtbar machen?
Python ist Cool!
Statt das Bild neu zu erzeugen, kannst und solltest du dir das Bild halt merken. Das ist wie schon mehrfach in diesem Thread angesprochen die Ursache fuer dein Problem. Das es jetzt in __init__ klappt liegt nur daran, dass das wegen des Aufrufs von mainloop nie verlassen wird.
- __blackjack__
- User
- Beiträge: 14018
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Der_Scripter: Dann sollte Deine Schule mal auf Python 3 aktualisieren, denn Python 2 wird nicht mehr lange unterstützt: https://pythonclock.org/
Und das gilt nicht nur für Python 2 selbst, sondern auch so einige Bibliotheken und Projekte die ab Januar den Support einstellen. Einige sind bereits für Python 2 schon jetzt nur noch im Bugfix-Modus für ältere Versionen, das heisst die aktuellen Versionen gibt es bereits nur noch für Python 3: https://python3statement.org/
Du könntest übergangsweise auch so programmieren, dass es unter Python 2 und Python 3 läuft. Das haben viele Projekte in der Übergangszeit gemacht, auch wenn es IMHO ein bisschen sehr spät ist damit jetzt anzufangen, zumindest bei neuen Projekten.
Das mit dem `destroy()`\en und immer wieder neu aufbauen von Fensterinhalten klingt sehr ungewöhnlich. Dann verändert sich ja auch dauernd die Fenstergrösse. Es sei denn man macht solchen Unsinn wie `place()` zu verwenden… Oh warte…
Und das gilt nicht nur für Python 2 selbst, sondern auch so einige Bibliotheken und Projekte die ab Januar den Support einstellen. Einige sind bereits für Python 2 schon jetzt nur noch im Bugfix-Modus für ältere Versionen, das heisst die aktuellen Versionen gibt es bereits nur noch für Python 3: https://python3statement.org/
Du könntest übergangsweise auch so programmieren, dass es unter Python 2 und Python 3 läuft. Das haben viele Projekte in der Übergangszeit gemacht, auch wenn es IMHO ein bisschen sehr spät ist damit jetzt anzufangen, zumindest bei neuen Projekten.
Das mit dem `destroy()`\en und immer wieder neu aufbauen von Fensterinhalten klingt sehr ungewöhnlich. Dann verändert sich ja auch dauernd die Fenstergrösse. Es sei denn man macht solchen Unsinn wie `place()` zu verwenden… Oh warte…
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
-
- User
- Beiträge: 26
- Registriert: Sonntag 1. September 2019, 15:32
Habe schon mit dem Systemadmin gesprochen, dass problem ist, dass die Aufgaben für die Schüler haben, die nur in Python 2 funktionieren.__blackjack__ hat geschrieben: Montag 2. September 2019, 16:45 @Der_Scripter: Dann sollte Deine Schule mal auf Python 3 aktualisieren, denn Python 2 wird nicht mehr lange unterstützt: https://pythonclock.org/
Und das gilt nicht nur für Python 2 selbst, sondern auch so einige Bibliotheken und Projekte die ab Januar den Support einstellen. Einige sind bereits für Python 2 schon jetzt nur noch im Bugfix-Modus für ältere Versionen, das heisst die aktuellen Versionen gibt es bereits nur noch für Python 3: https://python3statement.org/
Habe mich noch nicht mit Frames beschäftigt (wie gesagt bin Anfänger). Ich meine z.B. dass man ein Hauptmenü hat dort kann man auf einen Button klicken der führt auf eine andere Seite und von da aus kann man durch einen zurück Button wieder ins Hauptmenü.Sirius3 hat geschrieben: Montag 2. September 2019, 16:43 Was meinst Du mit „ändern und wieder zurückändern”?
Wenn Du mehrere Ansichten hast, solltest Du über Frames nachdenken, die man auch wieder als Klassen modelieren könnte.
Vielleicht so wie die Dateien Index und so weiter in html, wenn du weißt was ich meine

Python ist Cool!
-
- User
- Beiträge: 26
- Registriert: Sonntag 1. September 2019, 15:32
Habe jetzt eine improvisierte Lösung: self.forget_place().
Aber wie kann ich jetzt das ganze wieder sichtbar machen?
Aber wie kann ich jetzt das ganze wieder sichtbar machen?
Python ist Cool!
Um so schlimmer, dass Aufgaben nicht regelmäßig aktualisiert werden.Der_Scripter hat geschrieben: Montag 2. September 2019, 17:03 Habe schon mit dem Systemadmin gesprochen, dass problem ist, dass die Aufgaben für die Schüler haben, die nur in Python 2 funktionieren.
Wenn ›place_forget‹ ein ›place‹ rückgängig macht, was wird dann wohl ›place_forget‹ rückgängig machen?
-
- User
- Beiträge: 26
- Registriert: Sonntag 1. September 2019, 15:32
Hab ich auch schon raus gefunden >place<
Danke, klappt jetzt
Danke, klappt jetzt
Python ist Cool!