Hello!
I am working on a GUI to connect to a MySQL database using MySQLdb (code in attached file). I define the cursor in lines 55-66 in the OnLogin function within the LoginDlg class.

/db= MySQLdb.connect(host='localhost', user=Username , passwd=pwd, db='Ornithobase')
self.cursor = db.cursor()/

When I try to use the cursor on another part of the code (EditUser class, line 176)

/sql = 'select substring_index(CURRENT_USER(),"@",1)'
login.cursor.execute(sql)/

I get this error:

/AttributeError: 'LoginDlg' object has no attribute 'cursor'/

You can check the code for details, I think is better.
Cheers!

Dani

--
Daniel Valverde Saubí
c/Joan Maragall 37 4 2
17002 Girona
Spain
Telèfon mòbil: +34651987662
e-mail: dani.valve...@gmail.com
http://www.acrocephalus.net
http://natupics.blogspot.com

Si no és del tot necessari, no imprimeixis aquest missatge. Si ho fas utilitza 
paper 100% reciclat i blanquejat sense clor. D'aquesta manera ajudaràs a 
estalviar aigua, energia i recursos forestals.  GRÀCIES!

Do not print this message unless it is absolutely necessary. If you must print 
it, please use 100% recycled paper whitened without chlorine. By doing so, you 
will save water, energy and forest resources. THANK YOU!

#! /usr/bin/env python
# OrnithobaseGUI.py

import wx, MySQLdb, wx.lib.intctrl

ID_HELP = 1
ID_ABOUT = 2
ID_LOG=3
ID_NEWUSER=4
ID_NEWUSER2=5
ID_DELUSER=6
ID_EDITUSER = 7


class LoginDlg(wx.Dialog):
        def __init__(self):
                wx.Dialog.__init__(self, None, -1, 'Login to Ornithobase 1.0b', 
size=(250,150))
                # widgets
                userLbl = wx.StaticText(self, -1, 'Username:', size=(75, -1))
                self.userTxt = wx.TextCtrl(self, -1, '', size=(200, -1))
                passwordLbl = wx.StaticText(self, -1, 'Password:', size=(75, 
-1))
                self.passwordTxt = wx.TextCtrl(self, -1, 
'',style=wx.TE_PROCESS_ENTER|wx.TE_PASSWORD, size=(200, -1))
                loginBtn = wx.Button(self, -1, 'Login')
                clearBtn = wx.Button(self, wx.ID_CLEAR, 'Clear')
                self.Bind(wx.EVT_BUTTON, self.OnLogin,loginBtn)
                self.Bind(wx.EVT_BUTTON, self.OnClear, clearBtn)


                # sizer / layout 
                userSizer     = wx.BoxSizer(wx.HORIZONTAL)
                passwordSizer = wx.BoxSizer(wx.HORIZONTAL)
                btnSizer      = wx.BoxSizer(wx.HORIZONTAL)
                mainSizer     = wx.BoxSizer(wx.VERTICAL)

                userSizer.Add(userLbl, 0, wx.ALL, 5)
                userSizer.Add(self.userTxt, 0, wx.ALL, 5)
                passwordSizer.Add(passwordLbl, 0, wx.LEFT|wx.RIGHT, 5)
                passwordSizer.Add(self.passwordTxt, 0, wx.LEFT, 5)
                btnSizer.Add(loginBtn, 0, wx.ALL, 5)
                btnSizer.Add(clearBtn, 0, wx.ALL, 5)
                mainSizer.Add(userSizer, 0, wx.ALL, 0)
                mainSizer.Add(passwordSizer, 0, wx.ALL, 0)
                mainSizer.Add(btnSizer, 0, wx.ALL, 5)

                # Logged in variable
                self.loggedIn = False

                self.SetSizer(mainSizer)
                self.Fit()
                self.Layout()
        def OnLogin(self, event):
                Username = self.userTxt.GetValue()
                pwd = self.passwordTxt.GetValue()
                try:
                        db= MySQLdb.connect(host='localhost', user=Username , 
passwd=pwd, db='Ornithobase')
                        self.cursor = db.cursor()
                        print 'Connected'
                        dlg = wx.MessageDialog(None, 'You are logged in', 
'Info', wx.OK)
                        dlg.ShowModal()
                        self.Destroy()
                except:
                        self.userTxt.Clear()
                        self.passwordTxt.Clear()
                        Errordlg = wx.MessageDialog(None, 'Connection failed', 
'Error', wx.OK | wx.ICON_ERROR)
                        print 'Connection failed'
                        Errordlg.ShowModal()

        def OnClear(self, event):
                self.userTxt.Clear()
                self.passwordTxt.Clear()

class NewUserDlg(wx.Dialog):
        def __init__(self):
                wx.Dialog.__init__(self, None, -1, 'Create new user', 
size=(400, 335))

#Define main panel
                panel = wx.Panel(self, -1)

        #Define sizers
                #Vertical sizers
                vbox = wx.BoxSizer(wx.VERTICAL)
                #Horizontal sizers
                NameSizer = wx.BoxSizer(wx.HORIZONTAL)
                FamilyNameSizer = wx.BoxSizer(wx.HORIZONTAL)
                eMailSizer = wx.BoxSizer(wx.HORIZONTAL)
                UsernameSizer = wx.BoxSizer(wx.HORIZONTAL)
                PasswdSizer = wx.BoxSizer(wx.HORIZONTAL)
                RepeatPasswdSizer = wx.BoxSizer(wx.HORIZONTAL)
                BtnSizer = wx.BoxSizer(wx.HORIZONTAL)
                Name = wx.StaticText(panel, -1, 'Name:', size=(100, -1))
                self.NameTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                NameSizer.Add(Name, 0, wx.ALL, 5)
                NameSizer.Add(self.NameTxt, 0, wx.ALL, 5)
                vbox.Add(NameSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                FamilyName = wx.StaticText(panel, -1, 'Family Name:', 
size=(100, -1))
                self.FamilyNameTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                FamilyNameSizer.Add(FamilyName, 0, wx.ALL, 5)
                FamilyNameSizer.Add(self.FamilyNameTxt, 0, wx.ALL, 5)
                vbox.Add(FamilyNameSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                eMail = wx.StaticText(panel, -1, 'e-Mail:', size=(100, -1))
                self.eMailTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                eMailSizer.Add(eMail, 0, wx.ALL, 5)
                eMailSizer.Add(self.eMailTxt, 0, wx.ALL, 5)
                vbox.Add(eMailSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                Username = wx.StaticText(panel, -1, 'Username:', size=(100, -1))
                self.UsernameTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                UsernameSizer.Add(Username, 0, wx.ALL, 5)
                UsernameSizer.Add(self.UsernameTxt, 0, wx.ALL, 5)
                vbox.Add(UsernameSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                Passwd = wx.StaticText(panel, -1, 'Password:', size=(100, -1))
                self.PasswdTxt = wx.TextCtrl(panel, -1, '', size=(250, -1), 
style = wx.TE_PASSWORD)
                PasswdSizer.Add(Passwd, 0, wx.ALL, 5)
                PasswdSizer.Add(self.PasswdTxt, 0, wx.ALL, 5)
                vbox.Add(PasswdSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                RepeatPasswd = wx.StaticText(panel, -1, 'Repeat Password:', 
size=(100, -1))
                self.RepeatPasswdTxt = wx.TextCtrl(panel, -1, '', size=(250, 
-1), style = wx.TE_PASSWORD)
                RepeatPasswdSizer.Add(RepeatPasswd, 0, wx.ALL, 5)
                RepeatPasswdSizer.Add(self.RepeatPasswdTxt, 0, wx.ALL, 5)
                vbox.Add(RepeatPasswdSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                okBtn = wx.Button(panel, -1, 'Ok')
                clearBtn = wx.Button(panel, -1, 'Clear')
                BtnSizer.Add(okBtn, 0, wx.ALL, 5)
                self.Bind(wx.EVT_BUTTON, self.OnOk,okBtn)
                BtnSizer.Add(clearBtn, 0, wx.ALL, 5)
                vbox.Add(BtnSizer, 0, wx.ALIGN_RIGHT | wx.ALL, 5)
                panel.SetSizer(vbox)
                self.Centre()
                self.Show(True)

        def OnOk(self, event):
                db= MySQLdb.connect(host='localhost', user='root' , 
passwd='acrsci00', db='Ornithobase')
                cursor = db.cursor()
                Name = self.NameTxt.GetValue()
                Surname = self.FamilyNameTxt.GetValue()
                eMail = self.eMailTxt.GetValue()
                Username = self.UsernameTxt.GetValue()
#Check if username already exists
                sql = '''use mysql'''
                cursor.execute(sql)
                sql = '''select count(*) from user where User=%s'''
                cursor.execute(sql, (Username))
                result = cursor.fetchall()
                result = list(result[0])
                result = str(result)
                result = int(result[1])
                if result == 1:
                        wx.MessageBox('This username is already in use. Please 
choose another one', 'Exclamation', style= wx.OK | wx.ICON_EXCLAMATION)
                        self.UsernameTxt.Clear()
                Passwd = self.PasswdTxt.GetValue()
#Check if password already exists
                RepeatPasswd = self.RepeatPasswdTxt.GetValue()
                if Passwd == RepeatPasswd:
                        sql = 'create user ''%s''@''localhost'' identified by 
%s'
                        cursor.execute(sql, (Username, Passwd))
                        sql = 'grant all privileges on Ornithobase.* to 
''%s''@''localhost'''
                        cursor.execute(sql, (Username))
                        sql = '''use Ornithobase'''
                        cursor.execute(sql)
                        newUser = '''INSERT INTO Users (Name, 
FamilyName,eMail,Username) VALUES (%s, %s, %s, %s)'''
                        cursor.execute(newUser, (Name, Surname, eMail, 
Username))
                        db.commit()
                        dlg = wx.MessageDialog(None, 'New user created', 
'Info', wx.OK)
                        dlg.ShowModal()
                        self.Destroy()
                else:
                        wx.MessageBox('Passwords do not match', 'Error', 
style=wx.ICON_ERROR)
                        self.PasswdTxt.Clear()
                        self.RepeatPasswdTxt.Clear()

class EditUserDlg(wx.Dialog):
        def __init__(self):
                wx.Dialog.__init__(self, None, -1, 'Edit user', size=(400, 335))
                def GetCurrentUser():
                        login = LoginDlg()
                        sql = 'select substring_index(CURRENT_USER(),"@",1)'
                        login.cursor.execute(sql)
                        result = login.cursor.fetchall()
                        textResult = str('')
                        for record in result:
                                for field in record:
                                        CurrentUser = str(field)
                                        return CurrentUser
                CurrentUser = GetCurrentUser()
                
                #Define main panel
                panel = wx.Panel(self, -1)

        #Define sizers
                #Vertical sizers
                vbox = wx.BoxSizer(wx.VERTICAL)
                #Horizontal sizers
                NameSizer = wx.BoxSizer(wx.HORIZONTAL)
                FamilyNameSizer = wx.BoxSizer(wx.HORIZONTAL)
                eMailSizer = wx.BoxSizer(wx.HORIZONTAL)
                UsernameSizer = wx.BoxSizer(wx.HORIZONTAL)
                PasswdSizer = wx.BoxSizer(wx.HORIZONTAL)
                RepeatPasswdSizer = wx.BoxSizer(wx.HORIZONTAL)
                BtnSizer = wx.BoxSizer(wx.HORIZONTAL)
                Name = wx.StaticText(panel, -1, 'Name:', size=(100, -1))
                self.NameTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                NameSizer.Add(Name, 0, wx.ALL, 5)
                NameSizer.Add(self.NameTxt, 0, wx.ALL, 5)
                vbox.Add(NameSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                FamilyName = wx.StaticText(panel, -1, 'Family Name:', 
size=(100, -1))
                self.FamilyNameTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                FamilyNameSizer.Add(FamilyName, 0, wx.ALL, 5)
                FamilyNameSizer.Add(self.FamilyNameTxt, 0, wx.ALL, 5)
                vbox.Add(FamilyNameSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                eMail = wx.StaticText(panel, -1, 'e-Mail:', size=(100, -1))
                self.eMailTxt = wx.TextCtrl(panel, -1, '', size=(250, -1))
                eMailSizer.Add(eMail, 0, wx.ALL, 5)
                eMailSizer.Add(self.eMailTxt, 0, wx.ALL, 5)
                vbox.Add(eMailSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                Username = wx.StaticText(panel, -1, 'Username:', size=(100, -1))
                self.UsernameTxt = wx.StaticText(panel, -1, CurrentUser, 
size=(250, -1))
                UsernameSizer.Add(Username, 0, wx.ALL, 5)
                UsernameSizer.Add(self.UsernameTxt, 0, wx.ALL, 5)
                vbox.Add(UsernameSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                Passwd = wx.StaticText(panel, -1, 'Password:', size=(100, -1))
                self.PasswdTxt = wx.TextCtrl(panel, -1, '', size=(250, -1), 
style = wx.TE_PASSWORD)
                PasswdSizer.Add(Passwd, 0, wx.ALL, 5)
                PasswdSizer.Add(self.PasswdTxt, 0, wx.ALL, 5)
                vbox.Add(PasswdSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                RepeatPasswd = wx.StaticText(panel, -1, 'Repeat Password:', 
size=(100, -1))
                self.RepeatPasswdTxt = wx.TextCtrl(panel, -1, '', size=(250, 
-1), style = wx.TE_PASSWORD)
                RepeatPasswdSizer.Add(RepeatPasswd, 0, wx.ALL, 5)
                RepeatPasswdSizer.Add(self.RepeatPasswdTxt, 0, wx.ALL, 5)
                vbox.Add(RepeatPasswdSizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)
                okBtn = wx.Button(panel, -1, 'Ok')
                clearBtn = wx.Button(panel, -1, 'Clear')
                BtnSizer.Add(okBtn, 0, wx.ALL, 5)
                BtnSizer.Add(clearBtn, 0, wx.ALL, 5)
                vbox.Add(BtnSizer, 0, wx.ALIGN_RIGHT | wx.ALL, 5)
                panel.SetSizer(vbox)
                self.Centre()
                self.Show(True)

class Ornithobase(wx.Frame):
        def __init__(self, parent, id, title):
                wx.Frame.__init__(self, parent, id, title, size=(650,75))

        #Define menus
                menubar = wx.MenuBar()
        #Define file menu
                fileMenu = wx.Menu()
                log = wx.MenuItem(fileMenu, ID_LOG, '&Login\tCtrl+L')
                fileMenu.AppendItem(log)
                self.Bind(wx.EVT_MENU, self.OnLog, id=ID_LOG)
                NewUser = wx.MenuItem(fileMenu, ID_NEWUSER, '&New User\tCtrl+N')
                self.Bind(wx.EVT_MENU, self.NewUserDlg, id=ID_NEWUSER)
                fileMenu.AppendItem(NewUser)
                quit = wx.MenuItem(fileMenu, 1, '&Quit\tCtrl+Q')
                fileMenu.AppendItem(quit)
                self.Bind(wx.EVT_MENU, self.OnQuit, id=1)

        #Define edit menu
                editMenu = wx.Menu()
                manageUsers = wx.Menu()
                manageUsers.Append(ID_NEWUSER2, '&New user')
                self.Bind(wx.EVT_MENU, self.NewUserDlg, id=ID_NEWUSER2)
                manageUsers.Append(ID_EDITUSER, '&Edit user')
                self.Bind(wx.EVT_MENU, self.EditUserDlg, id=ID_EDITUSER)
                manageUsers.Append(ID_DELUSER, '&Delete user')
                self.Bind(wx.EVT_MENU, self.DelUserDlg, id=ID_DELUSER)
                editMenu.AppendMenu(-1, 'Manage users', manageUsers)

        #Define help menu
                helpMenu = wx.Menu()
                helpMenu.Append(ID_HELP, '&Help')
                helpMenu.Append(ID_ABOUT, '&About')
                self.Bind(wx.EVT_MENU, self.OnAboutBox, id=ID_ABOUT)
                
#Append menus
                menubar.Append(fileMenu, '&File')
                menubar.Append(editMenu, '&Edit')
                menubar.Append(helpMenu, '&Help')
                self.SetMenuBar(menubar)
#Define main panel
                panel = wx.Panel(self, -1)
                vbox = wx.BoxSizer(wx.VERTICAL)
        #Define sizers
                #Vertical sizers
                hbox = wx.BoxSizer(wx.HORIZONTAL)
                #Horizontal sizers
                self.InitLifeList = wx.Button(panel,-1,'Initialize life 
list',size=(200,30))
                hbox.Add(self.InitLifeList, 0, wx.ALL , 5)
                self.NewData = wx.Button(panel,-1,'Enter new 
data',size=(200,30))
                hbox.Add(self.NewData, 0, wx.ALL , 5)
                self.Query = wx.Button(panel,-1,'Query your data',size=(200,30))
                hbox.Add(self.Query, 0, wx.ALL , 5)
                #Merge sizers
                vbox.Add(hbox, 0, wx.ALIGN_CENTER | wx.ALL, 5)

                panel.SetSizer(vbox)
                self.Centre()
                self.Show(True)

        def OnQuit(self, event):
                self.Close()

        def OnAboutBox(self, event):
                info = wx.AboutDialogInfo()
                info.SetIcon(wx.Icon('icons/exit.png', wx.BITMAP_TYPE_PNG))
                info.SetName('Ornithobase 1.0b')
                info.SetVersion('1.0b')
                description = open('docs/info.txt').read()
                info.SetDescription(description)
                info.SetCopyright('(C) 2010 Acrocephalus Soft')
                info.SetWebSite('http://www.acrocephalus.net')
                license = open('docs/licence.txt').read()
                info.SetLicence(license)
                info.AddDeveloper('Daniel Valverde')
                info.AddDocWriter('Daniel Valverde')
                info.AddArtist('Daniel Valverde')
                info.AddTranslator('Daniel Valverde')
                wx.AboutBox(info)

        def OnClose(self, event):
                self.Close(True)
        
        def OnLog(self, event):
                dlg = LoginDlg()
                dlg.ShowModal()

        def NewUserDlg(self, event):
                dlg = NewUserDlg()
                dlg.ShowModal()

        def DelUserDlg(self, event):
                dlg = wx.MessageDialog(None, 'Are you sure you want to delete 
your user?', 'Question', wx.OK | wx.CANCEL | wx.NO_DEFAULT | wx.ICON_QUESTION)
                dlg.ShowModal()

        def EditUserDlg(self, event):
                dlg = EditUserDlg()
                dlg.ShowModal()

app = wx.App()
Ornithobase(None, -1, 'Ornithobase 1.0b')
app.MainLoop()

<<attachment: dani_valverde.vcf>>

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to