Seite 1 von 1

Entry beim Verlassen prüfen

Verfasst: Freitag 9. Dezember 2005, 11:52
von Mawilo
Hallo,

ich habe verschiedene Entrys, bei denen beim Verlassen eine Formatüberprüfung durchgeführt werden soll. Ist das Format falsch, so muss eine Fehlermeldung aufpoppen und das Entry wieder den Fokus bekommen.
So weit ist das kein Problem.
Aber wie kann ich beim Verlassen des Entrys eine Funktion aufrufen? Wenn ich das mit bind('<FocusOut>',Funktion) mache, bekomme ich nicht das Entry, welches verlassen wird, sondern das, was neu den Fokus hat. Wenn ich z.B. bind('<ButtonRelease 1>',Funktion) verwende, wird nur eine Möglichkeit abgefangen. Ich möchte auch nicht immer alle Entrys abfragen, sondern nur das, welches gerade verlassen wird.

Hier mein Code (ist noch nicht fertig):

Code: Alles auswählen

from Tkinter import *
import Pmw
import time
import calendar

class Worktime:
    def __init__(self,frame,name,month,year):
        self.frame = frame
        self.name = name
        self.month = month
        self.year = year
        self.inputFields()
        
    def inputFields(self):
        fr1 = Frame(self.frame,bd=1)
        fr1.pack(fill=X)
        fr2 = Frame(self.frame)
        fr2.pack()
        lb1 = Label(fr1,text='Datum',font=('Arial',11),width=6,relief=RIDGE).pack(side=LEFT)
        lb2 = Label(fr1,text='Tag',font=('Arial',11),width=3,relief=RIDGE).pack(side=LEFT)
        lb3 = Label(fr1,text='Zeit von',font=('Arial',10),width=7,relief=RIDGE).pack(side=LEFT)
        lb4 = Label(fr1,text='Zeit bis',font=('Arial',10),width=7,relief=RIDGE).pack(side=LEFT)
        lb5 = Label(fr1,text='Dauer',font=('Arial',11),width=6,relief=RIDGE).pack(side=LEFT)
        lb6 = Label(fr1,text='Pause',font=('Arial',11),width=6,relief=RIDGE).pack(side=LEFT)
        lb7 = Label(fr1,text='Arb-zeit',font=('Arial',11),width=6,relief=RIDGE).pack(side=LEFT)
        self.sf = Pmw.ScrolledFrame(fr2,usehullsize = 1,hull_width = 420,hull_height = 400)
        self.sf.pack()
        self.wg = {}
        tage = self.daysInMonth()
        entrys = 2
        labels = 3
        for i in xrange(1,tage+1,1):
            tmp = []
            day = self.year,self.month,i,0,0,0,0,0,0
            dates = time.localtime(time.mktime(day))         
            labeldate = Label(self.sf.interior(),text='%02i.%02i.'%(dates[2],dates[1]),
                          width=6,relief=RIDGE,font=('Arial',11),justify=CENTER)
            labeldate.grid(row=i,column=0)           
            labelday = Label(self.sf.interior(),text='%s'%(defs.day_dic[dates[6]]),
                          width=3,relief=RIDGE,font=('Arial',11),justify=CENTER)
            labelday.grid(row=i,column=1)
            if dates[6] == 5:
                labeldate['fg'] = 'blue'
                labelday['fg'] = 'blue'
            elif dates[6] == 6:
                labeldate['fg'] = 'red'
                labelday['fg'] = 'red'
            entry1 = Entry(self.sf.interior(),width=7,font=('Arial',11),
                           relief=RIDGE,justify=CENTER)
            entry1.grid(row=i,column=2)
            #entry1.bind('<KeyPress Tab>',self.returnEntry)
            entry1.bind('<FocusOut>',self.returnEntry)
            tmp.append(entry1)
            entry2 = Entry(self.sf.interior(),width=7,font=('Arial',11),
                           relief=RIDGE,justify=CENTER)
            entry2.grid(row=i,column=3)
            #entry2.bind('<KeyPress Tab>',self.returnEntry)
            entry2.bind('<FocusOut>',self.returnEntry)
            tmp.append(entry2)
            label1 = Label(self.sf.interior(),width=6,text='',relief=RIDGE,
                          font=('Arial',11),justify=CENTER)
            label1.grid(row=i,column=4)
            tmp.append(label1)
            label2 = Label(self.sf.interior(),width=6,text='',relief=RIDGE,
                          font=('Arial',11),justify=CENTER)
            label2.grid(row=i,column=5)
            tmp.append(label1)
            label3 = Label(self.sf.interior(),width=6,text='',relief=RIDGE,
                          font=('Arial',11),justify=CENTER)
            label3.grid(row=i,column=6)
            tmp.append(label1)
            self.wg[i] = tmp
        #bu = Button(fr2,text='test',command=self.returnEntry,takefocus=0).pack()
       
        #self.wg[1][0].insert(END,'12:00')
        #self.wg[1][1].insert(END,'15:00')
        
    def daysInMonth(self):
        return calendar.monthrange(self.year,self.month)[1]

    def returnEntry(self,event):
        activeEntry = self.sf.focus_get()
        self.testFormat(activeEntry)

    def testFormat(self,entry):
        if entry.get() == '':
            pass
        else:
            print entry.get()


if __name__ == '__main__':
    root = Tk()
    fr = Frame(root).pack()
    Worktime(fr,'tester',11,2005)
    root.mainloop()
Stephan

Verfasst: Dienstag 13. Dezember 2005, 23:51
von wuf
Hallo Stephan

Du musst die folgende Methode leicht abändern:

Code: Alles auswählen

def returnEntry(self,event): 
	activeEntry = event.widget #self.sf.focus_get() 
	self.testFormat(activeEntry) 
Gruss wuf :wink:

Verfasst: Mittwoch 14. Dezember 2005, 13:54
von Mawilo
Hallo wuf,

danke, funktioniert wunderbar.

Stephan