Eingabe im Eingabefeld wird nicht angezeigt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Leon1357
User
Beiträge: 1
Registriert: Samstag 26. November 2016, 17:11

Moin,

Vorab: Ich bin super neu zu Python und auch allgemein zum Programmieren. Also bitte ein bisschen gnädig mit meiner Dummheit sein. :D

Problem:

- Ich habe das anbei liegende Script. Aus irgendeinem Grund liefert mir das "Programm", aber die Eingabe nicht wieder aus. Woran liegt das?
- Außerdem würde ich ganz gerne, dass die Eingabe nich in der Python Shell, sondern im "Programm" wiedergegeben wird. Ich habe aber überhaupt kein Plan, wie ich das anstellen soll.

Vielen Dank im Voraus.

Grüße

Leon

Code: Alles auswählen

from Tkinter import *


master = Tk()
e = Entry(master)
e.pack()
e.focus()

f = Entry(master)
f.pack()
f.focus()

g = Entry(master)
g.pack()
g.focus()

def Eingabefelder():
    def Datum():
        print e.get()
    def Betrag():
        print f.get()
    def Buchunstext():
        print g.get()

b = Button(master, text = "Enter", width = 10, command = Eingabefelder,)
b.pack()


mainloop()
Zuletzt geändert von Anonymous am Samstag 26. November 2016, 17:41, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Leon1357: Das liegt daran, das in der Funktion `Eingabefelder()` beim Ausführen einfach nur drei Funktionen definiert werden. Eine Funktionsdefinition definiert eine Funktion nur und führt sie nicht auch gleichzeitig schon aus. Das will man an der Stelle in der Regel ja auch gar nicht.

Sonstige Anmerkungen zum Quelltext: Sternchen-Importe sind Böse™. Damit holst Du Dir gerade bei `Tkinter` cirka 190 Namen ins Modul von denen Du ziemlich sicher nur einen ganz kleinen Bruchteil brauchst. Sternchen-Importe machen Programme unübersichtlicher, weil man dann nicht mehr weiss wo welcher Name eigentlich her kommt. Und es besteht die Gefahr von Namenskollisionen. Üblicherweise wird `Tkinter` mit ``import Tkinter as tk`` importiert und die Objekte aus dem Modul dann explizit über das Modul angesprochen, also zum Beispiel `tk.Entry`.

Gute Namen sind wichtig. `e`, `f`, und `g` sind keine guten Namen für Eingabefelder weil sie dem Leser nicht vermitteln was für eine Bedeutung das jeweilige Eingabefeld im Programm hat. `b` ist auch kein guter Name.

Funktionen *tun* etwas, weswegen man den Funktionsnamen üblicherweise nach der Tätigkeit auswählt, welche die Funktion ausführt. Damit weiss man dann was die Funktion macht und man kann Funktionen auch leichter von ”passiven” Werten unterscheiden.

Die `focus()`-Methode setzt *den* Fokus auf das Anzeigeelement auf dem die Methode aufgerufen wurde. Es kann nur ein Element den Fokus haben. Also macht es wenig Sinn das drei mal hintereinander auf verschiedenen Anzeigeelementen aufzurufen. Und bei drei Eingabefeldern würde ich als Benutzer den Fokus ja irgendwie eher dem ersten Eingabefeld erwarten. Und das sollte eigentlich auch das Standardverhalten sein.

Wenn die Werte im Programm, also in der GUI angezeigt werden sollen, dann müsstest Du dafür ein, oder vielleicht auch mehrere, entsprechende Anzeigeelemente verwenden und Code schreiben, der die Eingabe dann auch dort anzeigt. Man könnte da ein `Label` für verwenden, oder auch drei — eines für jede Eingabe, oder ein `Text`-Widget. Was man, wenn der Anwender dort nicht drin schreiben können soll, entsprechend (ent)sperren muss, vor und nachdem man die Ausgabe(n) gemacht hat.

Letztlich braucht man für jede nicht-triviale GUI in Python objektorientierte Programmierung (OOP). Was jetzt nicht unbedingt das Thema ist, mit dem man als Anfänger starten sollte. Denn bei der GUI-Programmierung kommt zu OOP die ereignisbasierte Programmierung hinzu. Und vor OOP sollte man Funktionen gut verstanden haben. Und davor liegen die Grundlagen mit grundsätzlich linearem Programmablauf und den imperativen Kontrollstrukturen um diesen Ablauf zu steuern. Das baut alles aufeinander auf. Bei GUI-Programmierung braucht man *alles* davon, muss das alles auf einmal lernen wenn man mit GUIs anfängt.
BlackJack

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import Tkinter as tk
from functools import partial

     
def enter_posting(date_entry, amount_entry, posting_text_entry):
    print(date_entry.get())
    print(amount_entry.get())
    print(posting_text_entry.get())
     

def main():
    root = tk.Tk()

    date_entry = tk.Entry(root)
    date_entry.pack()
    date_entry.focus()
     
    amount_entry = tk.Entry(root)
    amount_entry.pack()
    amount_entry.focus()
     
    posting_text_entry = tk.Entry(root)
    posting_text_entry.pack()
    posting_text_entry.focus()

    tk.Button(
        root,
        text='Enter',
        command=partial(
            enter_posting, date_entry, amount_entry, posting_text_entry
        ),
    ).pack()
     
    root.mainloop()


if __name__ == '__main__':
    main()
Antworten