In einem Label Variablen aktualisieren

Fragen zu Tkinter.
Antworten
ichbinjonathan
User
Beiträge: 5
Registriert: Freitag 3. September 2010, 15:41
Wohnort: Brüssel, Belgien

Hallo an alle!

Ich bin neu hier und allgemein ziemlicher Anfänger beim Programmieren in Python.
Bevor ich diesen Beitrag schieb, habe ich in vielen anderen Foren und auf vielen anderen Seiten nach einer Lösung gesucht. Vergeblich.

Mein Problem ist folgendes:
Ich möchte eigentlich nur, dass eine Variable, die ich in ein Label geschrieben habe, immer auf das Neueste aktualisiert wird. Am besten gebe ich euch ein Beispiel:

Code: Alles auswählen

from tkinter import*
root=Tk()
eingabe=Entry(root)
eingabe.pack()
def holer():
      a=eingabe.get()
      return a
b=holer()
but=Button(root,text='Abschicken', command=holer)
but.pack()
textfeld=Label(root, text=b) 
textfeld.pack()
root.mainloop()
Was ich eingentlich möchte, ist, dass immer wenn ich auf den Button 'Abschicken' klicke, im Label der Text erscheint, den ich in Entry 'eingabe' geschrieben habe.
Ich muss allerdings feststellen, dass er nur dann überrhaupt einen Text anzeigt, wenn ich wärend ich das Programm schreibe etwa in den Entry eingabe, was dann immer dort stehen bleibt, egal wie sich der Wert von holer() ändert.

Wie schon gesagt, ich bin ein blutiger Anfänger und hoffe, nicht euch die Zeit mit solchen Lapalien zu rauben...

Danke schonmal im Vorraus!
MFG
ichbinjonathan
BlackJack

@ichbinjonathan: Du musst den Wert in der Funktion in das Label schreiben, die aufgerufen wird, wenn der Button betätigt wird.

Allerdings solltest Du als Anfänger vielleicht erst einmal die Grundlagen lernen und erst mit GUI-Programmierung anfangen, wenn Du entweder objektorientierte Programmierung oder Closures halbwegs beherrscht. Sonst machst Du den zweiten vor dem ersten Schritt.
ichbinjonathan
User
Beiträge: 5
Registriert: Freitag 3. September 2010, 15:41
Wohnort: Brüssel, Belgien

Erstmal vielen Dank für die schnelle Antwort!
Wenn ich das richtig vertanden habe, müsste der Code dann so aussehen:

Code: Alles auswählen

from tkinter import*
root=Tk()
eingabe=Entry(root)
eingabe.pack()
def holer():
      a=eingabe.get()
      return a
but=Button(root,text='Abschicken', command=holer)
but.pack()
textfeld=Label(root, text=a) 
textfeld.pack()
root.mainloop()
Meinen Kenntnissen nach kann so etwas garnicht funktionieren, da [a] ja eine lokale Variable in holer() ist (Oder?).
Ich habe es trotzdem ausprobiert und auch da hat es nicht funktioniert (das Label hatte keinen Inhalt).

Im übrigen behersche ich die objektoriente Programmierung recht angemessen. Eigentlich wollte ich mit Tkinter anfangen, um eines meiner Programme, welches nur in IDLE und nur mit von der Tastatur eingegebenen Befehlen lief, graphisch zu machen, um die Bedienung zu vereinfachen. Ich habe mich meistens an der Seite www.wspiegel.de orientiert, um Tkinter zu lernen, allerdings musste ich feststellen, dass sie sehr Lückenhaft ist.

MFG
ichbinjonathan
Morgen ist heute schon gestern ;-)
BlackJack

@ichbinjonathan: Nein, so kann das natürlich nicht funktionieren. Die `holer()`-Funktion muss alles das machen, was passieren soll, wenn Du auf den Button drückst. Und das ist ja nicht nur das auslesen aus dem Eingabefeld, sondern eben auch das setzen in das Label. Das ``return`` in der Funktion ist recht sinnfrei. Überleg doch mal wer diese Funktion aufruft, und was der Aufrufer wohl mit dem Rückgabewert machen soll.
problembär

Du wirst Dich mit OOP vertraut machen müssen, junger Padawan:

Code: Alles auswählen

import tkinter as tk

class TkApp:

    def __init__(self):

        self.root = tk.Tk()
        self.eingabe = tk.Entry(self.root)
        self.eingabe.pack()
        self.but = tk.Button(self.root, text = 'Abschicken', command = self.holer)
        self.but.pack()
        self.textfeld = tk.Label(self.root, text = "Start")
        self.textfeld.pack()
        self.root.mainloop()

    def holer(self):
        self.textfeld.configure(text = self.eingabe.get())

app = TkApp()
Und hüte Dich vor 'global': 'global' führt zur dunklen Seite: Schneller, leichter erscheint es Dir, doch nicht an Dein Ziel bringen wird es Dich!

Gruß
pythonstarter
User
Beiträge: 53
Registriert: Donnerstag 15. April 2010, 20:34

problembär hat geschrieben:Du wirst Dich mit OOP vertraut machen müssen, junger Padawan:
Hi, ich bin selbst noch ganz am Anfang und lehne mich vielleicht recht weit aus dem Fenster:

ich kann nachvollziehen, dass OOP für große Projekte sinnvoll ist - aber in diesem Bsp. erkenne ich den Sinn für OOP nicht - oder?
BlackJack

@pythonstarter: Also genau *dieses* Beispiel geht noch ohne OOP, aber wenn's nur ein wenig komplizierter wird, kommt man mit Funktionen nicht mehr wirklich aus, bzw. programmiert dann doch letztendlich objektorientiert, denn man bastelt dann zwangsläufig Objekte mit Closures nach. GUIs sind auch das Paradebeispiel für die Anwendung von OOP.
problembär

pythonstarter hat geschrieben:
problembär hat geschrieben:Du wirst Dich mit OOP vertraut machen müssen, junger Padawan:
Hi, ich bin selbst noch ganz am Anfang und lehne mich vielleicht recht weit aus dem Fenster:

ich kann nachvollziehen, dass OOP für große Projekte sinnvoll ist - aber in diesem Bsp. erkenne ich den Sinn für OOP nicht - oder?
Tatsächlich ist es nicht unmöglich, Tk ohne OOP zu programmieren. Die Perl/Tk-Leute machen das häufiger. Guck's Dir an, es ist möglich, aber total unübersichtlich und schwierig. Außerdem ruft man innerhalb von Tk sowieso Methoden von Widget-Objekten auf ...
Ich bin eigentlich auch kein großer Freund von OOP, aber wenn's um GUIs geht, macht es die Sache schon viel einfacher. Daher lieber gleich dran gewöhnen!

Gruß
Antworten