Python: Másik osztály metódusának hívása

 ( dejo | 2007. november 13., kedd - 10:14 )

Sziasztok!
Nos objektum orientáltság környékén vagyok eltévedve és nem igazán ugrik be a megoldás.
Java-ban például definiálom az osztályt és példányosítom, majd használom. Itt a Pythonban legalábbis a Tkinter használatkor, egy kicsit másképpen van, ami már homályossá teszi kicsit.
De lehet, hogy nem is ez az ahol jelenleg eltévedtem.

Mondom konkrétan! Feltöltöttem a forrásokat ide: http://www.freeweb.hu/dejo/merleghaz/merleghaz.zip

{Ez egy raktárkezelő és mérleg kezelő (leolvassa a hídmérleg kijelzőjét soros porton ez a pyserial-al működik) és merlegjegy készítő program lesz, sokféle lekérdezéssel, költség elosztással, gyártással (alapnyagból késztermék, itt konkrétan kövekből és butumenbő aszfalt) stb..}

Három fájl van jelenleg benne:
dbkezelo.py # adatbázis elérési adatok; nyitás; zárás;
mstart.py # Bejelentkezés, főmenü
merlegeles.py # Merlegelés, első mérés, második mérés, mérlegjegy készítés, stb..

Az mstart.py belépteti a kezelőt, és ha belépett engedélyezi a menüt számára. A menü egyik pontja meghívja a merlegeles.py-ban lévő merlegjegy-et.

  def openMerleg(self):
    merlegeles.merlegjegy(self.master)

Nos szeretném itt is elérni a belépett kezelő adatait, amit az mstart.py-ben recKezelo rekordban tárolok.
Erre készítettem is egy átadó metódust:

  def KezRek(self):
      return  recKezelo

De sajnos nem tudom, hogy kellene meghívnom a merlegeles.py programban.
Kommenttel jelöltem, hogy most hogyan próbáltam, és mi a hibaüzenet.

Tudom ez így (mármint a források) elég kezdetleges, de ez lenne az első adatfeldolgozó programom Pythonban.
Szóval lehet cikizni szolídan "haveri alapon", de azért nagyon ne hülyézzetek le, mert nem tesz jót a lelkivilágomnak!
Elsődlegesen a konkrét problémám megoldása érdekelne, de azon túl is minden jobbító kritikát nagyon megköszönök.

-dejo-
Javítottam a forráskódon! 2007.11.14; 12:44

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A merlegeles.py elejére:
from mstart import belep
Nem olvastam végig a kódot, de a hibaüzenet alapján ennek meg kéne oldania.

Köszi!
Nem mondom, hogy semmi sem változott:
1.) Most már az mstart.py indításakor megnyílik egy plusz üres form "Tk" fejléccel, ami akkor sem záródik be, ha kilépek a főprogramból azaz az mstart.py-ból.
2.) Ezt a hibaüzenetet adja: "TypeError: unbound method KezRek() must be called with belep instance as first a rgument (got nothing instead)"
Így hívom:
recKezelo=belep.KezRek() # és nem igazán tudom kitalálni milyen argumentumot szeretne. a belep és a self, nem jöttek be!

A metódust is javítottam így:

def KezRek():
   return  recKezelo

De így is követeli az argumentumát.

Tehát most az a kérdés, hogy mi lehet a "belep instance", amit hiányol?
Úgy gondolom, valami belép minta az, de mi a belép minta?

Most nincs időm megnézni, de a "belep instance" az belép példány. Vagyis nem hoztad létre a belep osztálynak egy példányát, így nem tudod ezt a metódusát meghívni.
Ha létrehozol egy pédányt, utána a példányneve.függvényneve() módon tudod meghívni (pont mint javában). Létező példány nélkül elvileg csak statikus metódust tudsz hívni.

Ezt értem. És köszönöm.
De akkor hogyan működik a belep, amikor a saját metódusai meg lefutnak, látszik az eredménye: Feldobja a beléptető formot (ez még az __init__-ben van) és reagál a billentyűre, egérre, a belép gombra meghívja a saját hitelesit() metódusát, stb. Valahogy létre jön egy példány csak nem tudom mi a neve. Bizonyára a Tkinter hozza létre a vagy a "root = Tk()" vagy inkább a "belep(root)". De mi lehet a példány neve?
Ennyit is köszönök, dolgozz nyugodtan!
Majd keresgélek a Google-ban és a Daróczy Péter oldalain.

A "belep(root)" lesz az, ugyanis ez meghívja a belep osztály konstruktorát (belep.__init__()) a root paraméterrel. És ez a függvény visszaadja az új objektumot, tehát ha azt írod, hogy "valami = belep(root)" akkor az új objektum neve "valami" lesz. És innentől tudod használni.

Ja, és még valami: ha jól látom a recKezelo változót a hitelesít fv. hozza létre, de ilyen módon valószínűleg lokális változó lesz, így a KezRek() fv. nem fogja tudni visszaadni. Ha "self.recKezelo"-ként hoznád létre, akkor a belep osztály tagváltozója lenne, és akkor nem is kéne a KeyRek() fv., hanem tudnál rá (a fenti objektumot feltételezve) "valami.recKezelo" néven hivatkozni.

Javítottam a forráskódon. Feltettem ugyanoda: http://www.freeweb.hu/dejo/merleghaz/merleghaz.zip

- Mostmár valódi példányosítást használok minden esetben, azaz nem névtelen objektumot hoztam létre, hanem van nevük is. (Korábban ez is zavart, mert szinte minden példában névtelen osztállyal indítják a Tkinter mainloop()-ját.
- Kiküszöböltem az összes globális kulcsszót.

Az a problémám továbbra is, hogy a két osztályt külön, külön fájlban tárolom. Az mstart.py-ben a belep és a merlegeles.py-ban a merlegjegy osztályt. Ahhoz hogy hivatkozni tudjak az mstart.py-ben lévő belep-ből a merlegjegy-re, importálnom kell a merlegeles.py-t. Eddig rendben van.
De ez fordítva is igaz ahhoz, hogy a merlegjegy osztályból hovazkozzam a belep egy metódusára ide is importálnom kell az mstart.py-t. Itt a kígyó a saját farkába harapott, mert ha így csinálom a program indításakor kifogásolja a körbehivatkozást. Különben meg nem látja a két osztály oda-vissza egymást.
No ezt hogy kell megoldani?

Csak valószínüsítem, hogy ha egy fájlban lenne mind a két osztály és azok példányosítása is, akkor minden zokszó nélkül tudnám hívni az egyik objektumból a másikat és viszont.
De még rengeteg további osztály is lesz a programban, nem akarom az egészet egy fájlba tenni!

Megoldottam! Hála Bajusz Tamásnak a Python levlistáról.

Szóval amikor a merlegjegy-et példányosítom további paraméterként meg kell adnom a belep osztályt is.
Persze ezt a merlegjegy osztályban át is kell venni.
Példakód:

hívás:

   def openMerleg(self):
      meres=merlegeles.merlegjegy(root,ablak)

A merlegjegy osztályban pedig:

class merlegjegy:
  def __init__(self, parent, osztaly):
    self.merA = Toplevel(parent)
    self.ablak=osztaly

Köszonöm vyergas-nak is a segítséget.

Akkor úgy látom minden rendben. Örülök hogy segíthettem :-)