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: [email protected] 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
