(Python) Nie mogę używać metod między klasami

Odpowiedz Nowy wątek
2015-01-15 16:58
0

Robię mały projekcik na uczelnie i napotkałem na duży problem
Napisałem sobie 2 klasy i problem pojawił się kiedy chciałem z skorzystać z metod jednej klasy w drugiej
W normalnych językach obiektowych(C# lub java) po prostu stworzył bym metodę statyczną lub nowy obiekt danej klasy i po problemie.
Niestety nie tutaj, kombinuję od kilku godzin i niestety nie w dalszym ciągu nie mogę sobie z tym poradzić

import sys
import sqlite3
import temp
import wx
import wx.xrc

class SqlConnection():
    def __init__(self, connection=None, isconnectedd=False):
        self.connection = connection
        self.isconnectedd = isconnectedd

    def getConnection(self, baseName):
        try:
            self.connection = sqlite3.connect(baseName)
            self.isconnectedd = True
        except self.connection.DatabaseError:
            print "Blad bazy"
            self.isconnectedd = False

    def closeConnection(self):
        try:
            self.connection.close()
            print "zakonczylem polaczenie"
        except self.connection.DatabaseError:
            print "Blad bazy"

    def getQuery(self, querry):
        try:
            cursor = self.connection.execute(querry)
            return cursor
        except self.connection.DatabaseError:
            return None

    def toDatabase(self, querry):
        try:
            cursor = self.connection.execute(querry)
        except self.connection.DatabaseError:
            print 'errror'

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,484 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        self.toggleBtnPolacz = wx.ToggleButton( self, wx.ID_ANY, u"Polacz/Rozlacz", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.toggleBtnPolacz, 0, wx.ALL, 5 )

        radioBoxTabeleChoices = [ u"Ksiazki", u"Czytelnicy", u"Wypozyczenia" ]
        self.radioBoxTabele = wx.RadioBox( self, wx.ID_ANY, u"Wybierz tabele", wx.DefaultPosition, wx.DefaultSize, radioBoxTabeleChoices, 3, wx.RA_SPECIFY_COLS )
        self.radioBoxTabele.SetSelection( 2 )
        self.radioBoxTabele.Enable( False )

        bSizer1.Add( self.radioBoxTabele, 0, wx.ALL, 5 )

        self.buttonDodaj = wx.Button( self, wx.ID_ANY, u"Dodaj", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.buttonDodaj.Enable( False )

        bSizer1.Add( self.buttonDodaj, 0, wx.ALL, 5 )

        self.buttonUsun = wx.Button( self, wx.ID_ANY, u"Usun", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.buttonUsun.Enable( False )

        bSizer1.Add( self.buttonUsun, 0, wx.ALL, 5 )

        self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"Dodaj wartosci/Usun rekord po ID", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_staticText1.Wrap( -1 )
        bSizer1.Add( self.m_staticText1, 0, wx.ALL, 5 )

        self.zmiennaArea = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.zmiennaArea, 0, wx.ALL, 5 )

        self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"Wynik", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_staticText2.Wrap( -1 )
        bSizer1.Add( self.m_staticText2, 0, wx.ALL, 5 )

        self.wynik = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 400,300 ), 0 )
        bSizer1.Add( self.wynik, 0, wx.ALL, 5 )

        self.wlacznikint = True

        self.SetSizer( bSizer1 )
        self.Layout()
        self.Show(True)
        self.Centre( wx.BOTH )

        # Connect Events
        self.toggleBtnPolacz.Bind( wx.EVT_TOGGLEBUTTON, self.polaczRozlacz )
        self.radioBoxTabele.Bind( wx.EVT_RADIOBOX, self.tabela )
        self.buttonDodaj.Bind( wx.EVT_BUTTON, self.dodajRek )
        self.buttonUsun.Bind( wx.EVT_BUTTON, self.usunRek )

        #self.sq = SqlConnection(sqlite3, False)

    def __del__( self ):
        pass

    # Virtual event handlers, overide them in your derived class
    def polaczRozlacz( self, event ):

        self.buttonDodaj.Enable(self.wlacznikint)
        self.radioBoxTabele.Enable(self.wlacznikint)
        self.buttonUsun.Enable(self.wlacznikint)
        if self.wlacznikint == False:
            self.wlacznikint= True
        else:
            self.wlacznikint = False

    def tabela( self, event ):
        event.Skip()

    def dodajRek( self, event ):
        event.Skip()

    def usunRek( self, event ):
        event.Skip()

if __name__ == '__main__':
    sq = SqlConnection(sqlite3, False)
    sq.getConnection('wypozycz.db')

    app = wx.App()
    MyFrame1(None)
    print "obieg petli"
    app.MainLoop()
    if sq.isconnectedd:
        print('polaczono')
    else:
        print('niepolaczono')
    ttt = sq.getQuery('select * from ksiazka')
    for row in ttt:
        print row[0]," ",row[1]," ",row[2]

    sq.toDatabase('insert ')
edytowany 1x, ostatnio: newac, 2015-01-15 16:59

Pozostało 580 znaków

2015-01-15 17:05
0

A możesz pokazać gdzie konkretnie masz problem? Bo w pythonie mozesz zarówno mieć metodę statyczną jak i utworzyć obiekt. Więc nie bardzo rozumiem o czym piszesz...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-15 17:19
0

w metodach do obsługi zdarzeń chce użyć metod z klasy SqlConnection
Mniej więcej w ten sposób:

 ...
        sq = SqlConnection(sqlite3, False)

    def __del__( self ):
        pass

    # Virtual event handlers, overide them in your derived class
    def polaczRozlacz( self, event ):
                sq.getConnection("wypozycz.db" )   # <------ tu pokazuje mi IndentationError: expected an indented block
        self.buttonDodaj.Enable(self.wlacznikint)
        self.radioBoxTabele.Enable(self.wlacznikint)
        self.buttonUsun.Enable(self.wlacznikint)
        if self.wlacznikint == False:
            self.wlacznikint= True
        else:
            self.wlacznikint = False
            ...

próbowałem też w init wstawić self.sq = SqlConnection(sqlite3, False) i kilka innych rzeczy

generalnie chce w jakikolwiek sposób wywoływać metody z SqlConnection w klasie MyFrame1

Pozostało 580 znaków

2015-01-15 17:26
1

Nie wiem w jaki sposób Python jest nienormalny obiektowo :D

W Pythonie jeśli potrzebujesz metody statycznej, to prawdopodobnie jej nie potrzebujesz. Zamiast tego korzystaj ze zwykłych funkcji.

Edit:

tu pokazuje mi IndentationError: expected an indented block

Przetłumacz sobie Indentation i może zrozumiesz gdzie masz błąd :D

Jeśli chodzi o używanie metod klasy SqlConnection, to musisz stworzyć jej obiekt... jak w każdym normalnym języku obiektowym.

edytowany 2x, ostatnio: Wizzie, 2015-01-15 17:30

Pozostało 580 znaków

2015-01-15 17:33
0

Podałem przykład z innych języków.
W dalszym ciągu mnie wiem jak skorzystać z tych metod pomiędzy klasami.

Według tego co czytałem to powinienem stworzyć obiekt w init i napisałem, chyba

        sq = SqlConnection(sqlite3, False)

Jak pisałem cokolwiek w Javie czy w C# nie byłem tak sfrustrowany jak przy pisaniu tego...

edytowany 2x, ostatnio: newac, 2015-01-15 17:38

Pozostało 580 znaków

2015-01-15 17:37
0

Tworzysz sobie obiekt tej klasy gdzie chcesz, pisałeś, że próbowałeś w __init__, więc możesz i tam.

class Klasa:
    def __init__(self, foo):
        self.foo = foo

    def bar(self):
        self.foo.jakas_metoda()

Według tego co czytałem to powinienem stworzyć obiekt w init i napisałem, chyba

Pierwszy parametr (self, czy jakkolwiek go sobie nazwiesz) w metodzie jakiejś klasy to zawsze referencja to obiektu tej klasy. Czyli jak chcesz coś wsadzić do obiektu tej klasy to działasz na tym self, tak jak wyżej.

Jak pisałem cokolwiek w Javie czy w C# nie byłem tak sfrustrowany jak przy pisaniu tego...

Odpal sobie jakiś kurs albo tutorial.

edytowany 2x, ostatnio: Wizzie, 2015-01-15 17:40

Pozostało 580 znaków

2015-01-15 17:54
0

właśnie ten sposób też nie działa:

 Traceback (most recent call last):
  File "[..]__init__.py", line 111, in polaczRozlacz
    sq.getConnection("wypozycz.db")
NameError: global name 'sq' is not defined
class MyFrame1(wx.Frame):
       self.sq = SqlConnection(sqlite3, False)

       ...

            def polaczRozlacz(self, event):
        sq.getConnection("wypozycz.db")
        self.buttonDodaj.Enable(self.wlacznikint)
        self.radioBoxTabele.Enable(self.wlacznikint)
        self.buttonUsun.Enable(self.wlacznikint)
        if self.wlacznikint == False:
            self.wlacznikint = True
        else:
            self.wlacznikint = False

Pozostało 580 znaków

2015-01-15 18:01
0

meeh, zamien sq.getConnection na self.sq.getConnection

Pozostało 580 znaków

2015-01-16 10:08
0

Jakieś strasznie losowe te twoje wcięcia. Na którym roku jesteś?

Pozostało 580 znaków

2015-01-18 16:18
0

@up
To przy wklejaniu się poprzestawiało, generalnie zostało mi już tylko usuwanie. Jak na razie działa to, co prawda słabo ale mniejsza o to. Skryptowy bele zaliczyć.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0