[ Au197/79 @ 24.07.2003. 13:38 ] @
Radim u wxPython-u program za koji sam dobio ideju od HTTrack-a. Svidelo mi se što on stvara jedan index.html falj kojim objedinjuje razne projekte. Tako sam ja došao na ideju da napišem program koji će stvarati takve fajleove u pomoću kojih ću moći da povežem sve knjige i tutuorijal koje imam u elektronskom obliku (kao html, ps i pdf).

Već sam manje više ostvario ono što sam zamislio ali mi se javio jedan propust kojeg me mogu da se oslobodim a problem je više u domenu wx-a nego pitona.

Program parsira html fajlove i izdvaja iz njega linkove ka e-knjgama. On od svakog linka stvara objekat klase Veza sa atributom koji označava ime veze (tj. ono između <a ...> i </a>) i putanjom (ono u href). Ovi objekti se smeštaju u niz koji sam ja nazvao veze. Od atributa objekata u nizu vrši se popunjavanje tabele (wxGrid). Znači tabela samo odslikava niz veze.

Polja u 1. koloni tabele su imena veza i ona se mogu menjati. Kada se izmeni vrednost i kada se selektuje drugo polje tabele javlja se GrigCellChange događaj koji menja atribut u odgovarajućem objektu niza veze. Problem je u situacii kada se izvrši promena polja tabele, a ne selektuje se drugo polje. Tada nema GrigCellChange događaja. I ako se u toj situaciji pritisne neko od dugmića nastaje haos.

Počinje da se odigrava događaj vezan za to dugme (npr. Novi ili Otvori). On ili obriše ili učita nove objekte u niz veze. Tabela će prvo izbrisati sve redove da bi ih popunila sa novim stanjem niza veze. U toku tog brisanja će se okinuti GrigCellChange koji će ili pokušati da pristupi članu niza koji ne postoji => IndexError, ili će promeniti totalno deseti objekat klase Veza, koji pripada nekom drugom fajlu koji je u međuvremenu isparsiran.

Kako da napravim da se GrigCellChange javi čim se klikne negde van tabele i to pre nego što se javi događaj povezan sa elementom na koji se klikće?

Prikačio sam čitav program i napisao sam gomilu print naredbi iz kojih se vidi kako problem nastaje.
[ alex @ 24.07.2003. 21:22 ] @
Ovako iz glave, na tren sam pogledao kod, ali cini mi se da mozes da iskoristis EVT_KILL_FOCUS(func) dogadjaj.

Npr, u svoju klasu MojaMrezica, u __init__() metod probaj da dodas, odmah iza ostalih event deklaracija, nesto slicno ovome:

Code:

EVT_KILL_FOCUS(self, self.naPromenuPolja)


Time ce se funkcija naPromenuPolja() pozvati kada wxGrid izgubi fokus (odnosno kada neki drugi widget dobije fokus, u tvom slucaju, dugme).

Pregledacu detaljnije kod pa cu se javiti jos.

Poz,
alex.
[ Au197/79 @ 26.07.2003. 21:52 ] @
Ništa mi nije pomoglo jer se wxEVT_KILL_FOCUS javlja samo pri gašenju programa.
[ alex @ 27.07.2003. 02:17 ] @
Nije bas tacno, ali nema veze.. LM, evo koda koji provereno radi, dodaj event handlere na kraj svoje wxGrid klase i dodaj ove metode:

Code:

... u __init__()
    w=self.GetGridWindow()
    EVT_SET_FOCUS(w, self.OnSetFocus)
    EVT_KILL_FOCUS(w, self.OnKillFocus)

def OnKillFocus(self, evt):
    print "on kill focus"
    
def OnSetFocus(self, evt):
    print "on set focus"


Kada kliknes na wxGrid poziva se OnSetFocus(), a kad kliknes van wxGrid-a (bilo gde) poziva se OnKillFocus(). To je i ono sto tebi treba.

Poz,
alex.