Seite 1 von 1

Entry Felder auslesen und weiterverarbeiten

Verfasst: Montag 11. Februar 2008, 15:53
von nightm4r3^
Hallo liebe Python User,
ich hoffe ihr könnt mir hier vielleicht helfen :( . Ich sitze seit Tagen an einem Projekt aus der Schule. Und zwar soll ein Fenster mit einer Auswahlfunktion mehrerer Berechnungsmöglichkeiten angezeigt werden und bei Klicken auf einer der Buttons soll ein neues Fenster mit der Funktion aufgehen. Bis hierhin klappt alles Wunderbar

Code: Alles auswählen

#Definition des ggT:


def ggt(m, n):
    r=m%n
    while r!=0:
        m=n
        n=r
        r=m%n
    return n


#Hauptprogramm
def aufgabe1():
    fenster2=Toplevel()
    fenster2.geometry('400x300')
    fenster2.label=Label(fenster2,text='ggT berechnen', font=('Verdana',16,'bold'))
    fenster2.label.pack()
    fenster2.label2=Label(fenster2,text='Bitte geben Sie die erste Zahl ein')
    fenster2.label2.pack()
    e1=Entry(fenster2)
    e1.pack()
    fenster2.label3=Label(fenster2,text='Bitte geben Sie die zweite Zahl ein')
    fenster2.label3.pack()
    e2=Entry(fenster2)
    e2.pack()
    fenster2.button=Button(fenster2,text='Bestätigen',
                           command=ggt)
    fenster2.button.pack()    
    fenster2.mainloop()
    
from Tkinter import  *
fenster=Tk()
fenster.geometry('400x300')
fenster.label=Label(fenster,text='Bitte treffen Sie Ihre Auswahl', font=('Verdana',16,'bold'))
fenster.label.pack()
fenster.button=Button(fenster,text='ggT berechnen',
                      command=aufgabe1)
fenster.button.pack()
fenster.mainloop()


Wenn ich jetzt etwas in das Entry Feld eingebe und auf 'Bestätigen' klicke gibt er die Fehlermeldung

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "E:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
TypeError: ggt() takes exactly 2 arguments (0 given)


Ich brauche sehr schnell Hilfe wenn das Möglich ist.

Danke schon mal im vorraus.
nightm4r3^ :roll:

Re: Entry Felder auslesen und weiterverarbeiten

Verfasst: Montag 11. Februar 2008, 16:05
von audax

Code: Alles auswählen

fenster2.button=Button(fenster2,text='Bestätigen',
                       command=lambda: ggt(int(e1.get()), int(e2.get()))
Tkinter übergibt keine Werte, also musst du 'command' eine Parameterlose Funktion geben. Meistens erstellt man mit 'lambda' eine Funktion, die die gewünschte Funktion mit den richtigen Parametern aufruft.

btw:
Sternchenimporte sind böse :D

Verfasst: Montag 11. Februar 2008, 16:14
von nightm4r3^
Ich habe das Programm jetzt neu geschrieben und es funktioniert *Strahl* =D
danke audax für die Hilfe. Hab das mit dem Lambda noch nie gehört deshalb....naja egal vielen Dank auf jeden Fall




btw:
Sternchenimporte sind böse :D
Ja ich weiß aber wir sind halt noch nicht so weit und im Moment bleibt mir das die einzige Möglichkeit.

nightm4r3^ :roll:

Verfasst: Montag 11. Februar 2008, 16:17
von audax
Dann zeig ich dir den Trick mal:

Code: Alles auswählen

import Tkinter as tk

entryfield = tk.Entry(foo='baar)
Fang gar nicht erst mit Sternchenimporten an! :D

Verfasst: Montag 11. Februar 2008, 16:20
von nightm4r3^
Ich glaube das geht mir im Moment noch ein wenig zu weit oder kann ich einfach den 'from Tkinter import *' weg lassen und dafür 'import Tkinter as tk' setzen?

Verfasst: Montag 11. Februar 2008, 16:26
von audax
Ungefähr, ja.
Dafür spricht du dann alles Tkinter-kram mit tk.NAME an.

Code: Alles auswählen

def aufgabe1():
    fenster2=tk.Toplevel()
    fenster2.geometry('400x300')
    fenster2.label=tk.Label(fenster2,text='ggT berechnen', font=('Verdana',16,'bold'))
    fenster2.label.pack()
    fenster2.label2=tk.Label(fenster2,text='Bitte geben Sie die erste Zahl ein')
    fenster2.label2.pack()
    e1=tk.Entry(fenster2)
    e1.pack()
    fenster2.label3=tk.Label(fenster2,text='Bitte geben Sie die zweite Zahl ein')
    fenster2.label3.pack()
    e2=tk.Entry(fenster2)
    e2.pack()
    fenster2.button=tk.Button(fenster2,text='Bestätigen',
                           command=ggt)
    fenster2.button.pack()   
    fenster2.mainloop()
So zum Beispiel!

Verfasst: Montag 11. Februar 2008, 17:53
von nightm4r3^
Und was ist, wenn ich mal grad nachfragen darf, der große Unterschied zwischen meiner Lösung un der hier angegebenen?

Verfasst: Montag 11. Februar 2008, 18:27
von BlackJack
Bei Sternchen-Importen holt man sich alle (öffentlichen) Namen aus dem Modul in den eigenen Namensraum. Wenn man das mit mehreren Modulen macht, geht schnell die Übersicht verloren, welcher Name denn nun eigentlich woher kommt. Ausserdem besteht die Gefahr von Namenskollisionen. Verschiedene Module können ja durchaus gleiche Namen definieren. `Tkinter` und `PIL` definieren zum Beispiel beide `Image`.