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