Entry beim Verlassen prüfen

Fragen zu Tkinter.
Antworten
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Hallo wuf,

danke, funktioniert wunderbar.

Stephan
Antworten