Seite 1 von 1

Problem mit mehreren Fenstern

Verfasst: Freitag 10. September 2010, 22:25
von Meitantei_pH
Hallo, liebe Community.
Wie viele hier habe auch ich neu mit Python angefangen, unter anderem weil ich es jetzt auch im Informatik Unterricht mache. Ich würde euch also bitten, das ganze für Dummies zu erklären^^

Ich habe folgendes Problem:
Ich habe ein Fenster, mit mehreren Entrys. Und nach der Eingabe kommt ein weiteres fenster mit entrys, etc. Hier ein beispiel mit 2 fenstern mit einem entry:

Code: Alles auswählen

from tkinter import*
fenster = Tk()
Label(fenster, text='Beispieltext', width=24,
        font=('Comic Sans MS', 14), fg='red').pack()
entryvariable1 = Entry(fenster).pack()
fenster.mainloop()

fenster = Tk()
Label(fenster, text='Beispieltext 2', width=24,
        font=('Comic Sans MS', 14), fg='red').pack()
entryvariable2 = Entry(fenster).pack()
fenster.mainloop()

entryvariable1.get()
entryvariable2.get()
2 Probleme:
die erneuerung der variable fenster im zweiten fenster führt zwar unter windows dazu, dass sich das fenster erneuert, aber unter linux nicht, zumal es angeblich schlechter programmierstil ist. und zweitens, die funktion .get() kommt zu spät^^
Ich müsste die entrys mit einer neuen variable im fenster get-ten.

Code: Alles auswählen

from tkinter import*

def funkti():
        entryvariable1x=entryvariable1.get()
        del(fenster)

fenster= Tk()
Label(fenster, text='Beispieltext', width=24,
        font=('Comic Sans MS', 14), fg='red').pack()
entryvariable1 = Entry(fenster).pack()
Button(fenster, Text='neu', command=funkti).pack()
fenster.mainloop()

mal 2
Die Theorie meiner Idee ist die, dass ich jetzt noch einen button habe, der dann nochmal den inhalt des entrys als string in einer neuen variable speichert. Das definiere ich als funktion, weil ich keine Ahnung habe wie ich es sonst in den button kriege^^
und dann zerstöre ich das fenster, damit das zweite kommen kann.
Das große Problem: del(fenster) sieht zwar wie ich finde super schick aus, funkitoniert aber leider gar nicht.^^
die frage die ich jetzt habe: Wie ich zerstöre ich ein fenster, und öffne ein anderes, und bekomm das in die def funkti, um sie mit dem button zu verbinden?
ich hoffe ihr versteht mein problem.

MfG
M_pH²

Re: Problem mit mehreren Fenstern

Verfasst: Freitag 10. September 2010, 23:29
von BlackJack
@Meitantei_pH: Ich weiss nicht ob man das eben mal schnell erschöpfend erklären kann, weil Du anscheinend echt viele und grundlegende Probleme beim Verständnis von Python und GUI-Programmierung hast.

Ein grosser Fehler ist, dass in einem Programm nur einmal ein Exemplar von `tkinter.Tk` erstellt werden darf. Das ist *das* Hauptfenster. Davon mehrere zu erstellen ist nicht schlechter Stil, sondern schlicht falsch. Wenn man weitere Fenster haben möchte, muss man Exemplare von `tkinter.Toplevel` erstellen.

Das was Du an `entryvariable1` (und ähnliche Namen) bindest, ist der Rückgabewert der `pack()`-Methode. Das ist nicht das Widget sondern der Wert `None`.

``del`` ist eine Anweisung und keine Funktion -- also sollte man da keine irreführenden Klammern setzen. Und es tut nicht das was Du anscheinend denkst. Es löscht *Namen* -- man kann damit nicht erzwingen, dass Objekte gelöscht werden. Aber den Namen `fenster` gibt es lokal in der Funktion ja auch gar nicht.

`mainloop()` sollte man auch nur einmal aufrufen. Womit wir beim strukturellen Problem wären: GUI-Programme laufen nicht so linear ab, wie Du das gerne hättest. GUI-Programmierung bedeutet ereignisbasierte Programmierung. Nicht Du bestimmst wie das Programm abläuft, sondern Du schreibst Code, der die GUI erstellt und sagst auf welche Ereignisse welche Deiner Funktionen und Methoden aufgerufen werden sollen, und dann gibst Du die Programmflusskontrolle an die Hauptschleife des GUI-Toolkits ab. *Das* ruft dann bei den Ereignissen die Dich interessieren den entsprechenden Code auf. Und der darf auch nur kurz laufen und muss die Kontrolle wieder an die Hauptschleife zurückgeben -- sonst "friert" die GUI für den Benutzer ein.

Für GUI-Programmierung sollte man die Grundlagen von Python drauf haben, bis einschliesslich objektorientierter Programmierung (OOP).

Re: Problem mit mehreren Fenstern

Verfasst: Samstag 11. September 2010, 16:32
von Meitantei_pH
Ich weiss nicht ob man das eben mal schnell erschöpfend erklären kann, weil Du anscheinend echt viele und grundlegende Probleme beim Verständnis von Python und GUI-Programmierung hast.
Da kannst du Recht haben. Ich will nicht sagen ob ich die Grundlagen beherrsche oder nicht, ich bin eindeutig der Mensch der das am schlechtesten beurteilen kann, was ich weiß oder eben nicht. Allerdings ist dieses Python-Lernen für mich kein 3 Wochen Ding. Wenn ich mich damit halt ein wenig beschäftige lass es 2 jahre dauern bis ich zu den profis gehöre.
Und ich habe auch erst angefangen, demnach ist es mir egal ob ich da probleme habe, die zeit wird das beheben, so ist zumindest mein Plan xD
Ein grosser Fehler ist, dass in einem Programm nur einmal ein Exemplar von `tkinter.Tk` erstellt werden darf. Das ist *das* Hauptfenster. Davon mehrere zu erstellen ist nicht schlechter Stil, sondern schlicht falsch. Wenn man weitere Fenster haben möchte, muss man Exemplare von `tkinter.Toplevel` erstellen.
Aha. Den Begriff Toplevel habe ich noch nie gehört, und hab deshalb wahrscheinlich mein 'tkinter.Tk()' als das behandelt was eigentlich ein Toplevel ist, da ich letzteres einfach noch nicht kannte. Ich sollte mir mal diese Toplevel ansehen.^^
Das was Du an `entryvariable1` (und ähnliche Namen) bindest, ist der Rückgabewert der `pack()`-Methode. Das ist nicht das Widget sondern der Wert `None`.
d-_-b also darauf hätte ich selbst kommen können, ich hatte ja schon mal eine fehlermeldung mit 'NoneType'.
``del`` ist eine Anweisung und keine Funktion -- also sollte man da keine irreführenden Klammern setzen. Und es tut nicht das was Du anscheinend denkst. Es löscht *Namen* -- man kann damit nicht erzwingen, dass Objekte gelöscht werden.
Jo^^ Das war mir schon klar, dass es del() in dieser verwendung nicht gibt, das war ja unter anderem das Problem. Zählt glaube ich zu den anfängerfehlern, mangelnde funktionen und anweisungen bekannt -> ich probiere mal doof rum.
Aber den Namen `fenster` gibt es lokal in der Funktion ja auch gar nicht.
Auch das stimmt. Das sind Fehler die ich liebend gerne mache. .pack() vergessen, ',' vergessen. Sollte ich bei definierten funktionen mehr beachten...
`mainloop()` sollte man auch nur einmal aufrufen. Womit wir beim strukturellen Problem wären: GUI-Programme laufen nicht so linear ab, wie Du das gerne hättest. GUI-Programmierung bedeutet ereignisbasierte Programmierung. Nicht Du bestimmst wie das Programm abläuft, sondern Du schreibst Code, der die GUI erstellt und sagst auf welche Ereignisse welche Deiner Funktionen und Methoden aufgerufen werden sollen, und dann gibst Du die Programmflusskontrolle an die Hauptschleife des GUI-Toolkits ab. *Das* ruft dann bei den Ereignissen die Dich interessieren den entsprechenden Code auf. Und der darf auch nur kurz laufen und muss die Kontrolle wieder an die Hauptschleife zurückgeben -- sonst "friert" die GUI für den Benutzer ein.

Für GUI-Programmierung sollte man die Grundlagen von Python drauf haben, bis einschliesslich objektorientierter Programmierung (OOP).
Das 'mainloop()' nur einmal aufgerufen darf deckt sich ja wunderbar mit der Tatsache, dass es mein 'fenster', das 'tkinter.Tk()', nur einmal geben darf. Mehrere 'tkinter.Tk()', mehrere 'mainloop()'.

Zu letzterem: Auch das mag stimmen. Das wird es sogar sicher. Doch bisher programmiere ich es so linear, weil es für mich so am einfachsten ist.
"Learning by doing" - so versuch ich das. Ich weiß was Syntax und Semantik ist, EVA-Prinzip, GUI kenne ich in der Tat noch nicht, Toplevel ebnfalls.
Es mag vll schwer sein einem "Newbie" wie mir das zu erklären, doch wie man sieht habe ich das verstanden was du mir erklärt hast, und dafür danke ich dir herzlichst. Ich habe gar nicht mit einer so schnellen und ausführlichen Antwort gerechnet, aber da wurde ich eines besseren belehrt.
Ich werde mir mal Toplevel ansehen, ein wenig zu GUI informieren. Und wenn ich wieder Fehler habe melde ich mich hier wieder.
Wenn nicht zeig ich euch das ganze Skript mal.

Für den Moment,
vielen herzlichen Dank BlackJack!

MfG
M_pH²