Entry Felder auslesen und weiterverarbeiten

Fragen zu Tkinter.
Antworten
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Montag 11. Februar 2008, 15:53

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:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 11. Februar 2008, 16:05

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
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Montag 11. Februar 2008, 16:14

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:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 11. Februar 2008, 16:17

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
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Montag 11. Februar 2008, 16:20

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?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 11. Februar 2008, 16:26

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!
nightm4r3^
User
Beiträge: 83
Registriert: Montag 11. Februar 2008, 15:43
Kontaktdaten:

Montag 11. Februar 2008, 17:53

Und was ist, wenn ich mal grad nachfragen darf, der große Unterschied zwischen meiner Lösung un der hier angegebenen?
BlackJack

Montag 11. Februar 2008, 18:27

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`.
Antworten