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

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 ')
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...

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

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.

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...

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.

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
0

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

0

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

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ć.

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