Editfeld-Daten an eine Funktion übergeben

Fragen zu Tkinter.
Antworten
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

Hallo,
ich habe hier folgenden Code. Beim Klick auf Datei -> Neu sollten eigentlich 2 Werte (username, password) aus dem Editfeld an die funktion acc_daten_speichern übergeben werden. Scheinbar mache ich das irgendwie falsch, da in die acc_daten.txt-Datei lediglich 3 Absätze geschrieben werden.

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import *
def test():
    """ Dummy-Funktion für Menü"""
    pass

def acc_daten_speichern(name,pw):
    f2 = open('acc_daten.txt','w')
    f2.write(name + '\n')
    f2.write(pw + '\n')

    f2.close()

def test2():
#Erzeugen des Account-Info-Speichern-Dialoges
    f1=Tk(className='Account Daten eingeben!')
    f1.geometry('100x100')
    f1.acc_name = Entry(f1, width=10);
    name=f1.acc_name.get()
    f1.acc_name.pack();
    f1.acc_pw = Entry(f1, width=10, show='*');
    pw=f1.acc_pw.get()
    f1.acc_pw.pack();
    f1.speichern = Button(f1, text='Daten speichern!', command=acc_daten_speichern(name,pw))
    f1.speichern.pack()

    
    f1.mainloop()

f=Tk()
f.geometry('500x500')
f.title('Test')
#Menüleiste erstellen
mle=Menu(master=f)
f.config(menu=mle)

#Menü erstellen
m1=Menu(master=mle)
mle.add_cascade(label='Datei', menu=m1)

#Menüpunkte für Menü 1
m1.add_command(label='Neu', command=test2)
m1.add_command(label='Oeffnen', command=test)
m1.add_separator()
m1.add_command(label='Speichern', command=test)
m1.add_command(label='Speichern unter', command=test)
f.mainloop()
Wieso werden die Daten nicht übergeben?

lg,
vogti
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

vogti hat geschrieben:Hallo,
ich habe hier folgenden Code. Beim Klick auf Datei -> Neu sollten eigentlich 2 Werte (username, password) aus dem Editfeld an die funktion acc_daten_speichern übergeben werden. Scheinbar mache ich das irgendwie falsch, da in die acc_daten.txt-Datei lediglich 3 Absätze geschrieben werden.
Abgesehen davon, dass es so nicht funktioniert, wie du dir das denktst: Dein Code ist dringend überarbeitungsbedürftig!
- Nenne Bezeichner nicht f1 oder f2? Verwende "sprechende Bezeichner".
- IMHO sollte man nicht irgendwelche Attribute an eine Instanz eines Tkinter-Widgets dranhängen, die damit direkt nichts zu tun haben.
- PEP 8 mal lesen
- Sternchenimport abgewöhnen und stattdessen "import Tkinter as tk"

Das, was du willst, funktioniert nicht, weil durch die Zuweisung

Code: Alles auswählen

name=f1.acc_name.get()
nur einmal zum Zeitpunkt des Aufrufs der get()-Methode der Inhalt des Entry-Feldes abgerufen und an name gebunden wird. Da zu diesem Zeitpunkt noch nichts drinsteht, steht in name auch nur eine leere Zeichenkette - und das bleibt so.

Mögliche Lösung: Verwende einen Button. Beim Klick auf den Button wird das Entry-Feld ausgelesen und die Daten verarbeitet.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo vogti !

Code: Alles auswählen

def acc_daten_speichern(name, pw):
    f2 = open('acc_daten.txt','w')
    f2.write(name.get() + '\n')
    f2.write(pw.get() + '\n')
    f2.close()

def test2():
#Erzeugen des Account-Info-Speichern-Dialoges
    f1=Tk(className='Account Daten eingeben!')
    f1.geometry('100x100')
    f1.acc_name = Entry(f1, width=10);
    f1.acc_name.pack();
    f1.acc_pw = Entry(f1, width=10, show='*');
    f1.acc_pw.pack();
    f1.speichern = Button(f1, text='Daten speichern!', command=lambda 
        name=f1.acc_name , pw=f1.acc_pw: acc_daten_speichern(name, pw))
    f1.speichern.pack()
    f1.mainloop()
gruss frank
Antworten