# -*- coding: utf-8 -*- import sqlite3 as lite import wx from ObjectListView import ObjectListView, ColumnDefn class Contacts(object): def __init__(self, name, tel, fax): self.name = name self.tel = tel self.fax = fax class DataOperation(object): def __init__(self): self.index = 1 self.table_name = 'table_' + str(self.index) def create_table(self): conn = lite.connect('data/data_file_db.sqlite') cursor = conn.cursor() cursor.execute("CREATE TABLE {tn} (name TEXT PRIMARY KEY, tel INT, fax INT)".format(tn = self.table_name)) conn.commit() conn.close() self.index += 1 def insert (self, name, tel, fax): conn = lite.connect('data/data_file_db.sqlite') cursor = conn.cursor() try: cursor.execute("INSERT INTO {tn} (name, tel, fax) VALUES (?, ?, ?)".format(tn = self.table_name), (name, tel, fax)) except lite.IntegrityError: dlg = wx.MessageDialog(self, Dialogs, u'الإسم موجود مسبقا في قاعدة البيانات', u'خطأ في الإسم') dlg.ShowModal() dlg.Destroy() conn.commit() conn.close() def print_data(self): conn = lite.connect('data/data_file_db.sqlite') cursor = conn.cursor() cursor.execute("SELECT * FROM {tn} ".format(tn = self.table_name)) rows = cursor.fetchall() list = [] for row in rows: list.append('{0} {1} {2}\n'.format(row[0], row[1], row[2])) text = ''.join(list) return rows class Dialogs(wx.Dialog): def __init__(self, db, parent, title, saveBtn = False, updBtn = False): wx.Dialog.__init__(self, None, wx.ID_ANY, title = title) self.db = db textCtrlSizer = wx.BoxSizer(wx.VERTICAL) buttonSizer = wx.BoxSizer(wx.HORIZONTAL) mainSizer = wx.BoxSizer(wx.VERTICAL) textNameLabel = wx.StaticText(self, wx.ID_ANY, 'name') textCtrlSizer.Add(textNameLabel, 0, wx.ALL|wx.EXPAND, 5) self.name = wx.TextCtrl(self, wx.ID_ANY, '') textCtrlSizer.Add(self.name, 0, wx.ALL|wx.EXPAND, 5) textTelLabel = wx.StaticText(self, wx.ID_ANY, 'telephone') textCtrlSizer.Add(textTelLabel, 0, wx.ALL|wx.EXPAND, 5) self.tel = wx.TextCtrl(self, wx.ID_ANY, '') textCtrlSizer.Add(self.tel, 0, wx.ALL|wx.EXPAND, 5) textFaxLabel = wx.StaticText(self, wx.ID_ANY, 'fax') textCtrlSizer.Add(textFaxLabel, 0, wx.ALL|wx.EXPAND, 5) self.fax = wx.TextCtrl(self, wx.ID_ANY, '') textCtrlSizer.Add(self.fax, 0, wx.ALL|wx.EXPAND, 5) save = wx.Button(self, wx.ID_ANY, 'save') save.Bind(wx.EVT_BUTTON, self.Onsave) save.Enable(saveBtn) buttonSizer.Add(save, 0, wx.ALL|wx.EXPAND, 5) update = wx.Button(self, wx.ID_ANY, 'update') update.Bind(wx.EVT_BUTTON, self.Onupdate) update.Enable(updBtn) buttonSizer.Add(update, 0, wx.ALL|wx.EXPAND, 5) cancel = wx.Button(self, wx.ID_ANY, 'cancel') cancel.Bind(wx.EVT_BUTTON, self.Oncancel) buttonSizer.Add(cancel, 0, wx.ALL|wx.EXPAND, 5) mainSizer.Add(textCtrlSizer, 0, wx.ALL|wx.EXPAND, 5) mainSizer.Add(buttonSizer, 0, wx.ALL|wx.EXPAND, 5) self.SetSizer(mainSizer) self.Show() def Onsave(self, evt): name = self.name.GetValue() tel = self.tel.GetValue() fax = self.fax.GetValue() conn = lite.connect('data/data_file_db.sqlite') cursor = conn.cursor() try: cursor.execute("INSERT INTO {tn} (name, tel, fax) VALUES (?, ?, ?)".format(tn = self.db.table_name), (name, tel, fax)) except lite.IntegrityError: msg = 'The name already exists in the database' dlg = wx.MessageDialog(self, msg, 'name error', wx.OK) dlg.ShowModal() dlg.Destroy() conn.commit() conn.close() self.Destroy() def Onupdate(self, evt): name = self.name.GetValue() tel = self.tel.GetValue() fax = self.fax.GetValue() old_name = self.old_name conn = lite.connect('data/data_file_db.sqlite') cursor = conn.cursor() cursor.execute("UPDATE {tn} SET name = ?, tel = ?, fax = ? WHERE name=?".format(tn = self.db.table_name), (name, tel, fax, old_name) conn.commit() conn.close() self.old_name = name def Oncancel(self, evt): self.Destroy() def setValues(self, name, tel, fax): self.old_name = name self.name.SetValue(name) self.tel.SetValue(tel) self.fax.SetValue(fax) class MainPanel(wx.Panel): def __init__(self, parent): self.operation = DataOperation() wx.Panel.__init__(self, self.operation, parent) # Create Sizer operationSizer1 = wx.BoxSizer(wx.VERTICAL) operationSizer2 = wx.BoxSizer(wx.HORIZONTAL) classesSizer = wx.BoxSizer(wx.VERTICAL) mainSizer = wx.BoxSizer(wx.HORIZONTAL) self.dataOlv = ObjectListView(self, wx.ID_ANY, style = wx.LC_REPORT|wx.SUNKEN_BORDER) operationSizer1.Add(self.dataOlv, 1, wx.ALL|wx.EXPAND, 5) self.setContacts() insert = wx.Button(self, -1, 'insert') insert.Bind(wx.EVT_BUTTON, self.Oninsert) operationSizer2.Add(insert, 0, wx.ALL|wx.EXPAND, 5) delete = wx.Button(self, -1, 'delete') delete.Bind(wx.EVT_BUTTON, self.Ondelete) operationSizer2.Add(delete, 0, wx.ALL|wx.EXPAND, 5) update = wx.Button(self, -1, 'update') update.Bind(wx.EVT_BUTTON, self.Onupdate) operationSizer2.Add(update, 0, wx.ALL|wx.EXPAND, 5) create = wx.Button(self, -1, 'create table') create.Bind(wx.EVT_BUTTON, self.Oncreate) operationSizer2.Add(create, 0, wx.ALL|wx.EXPAND, 5) refresh = wx.Button(self, wx.ID_ANY, 'refresh') refresh.Bind(wx.EVT_BUTTON, self.onRefresh) operationSizer2.Add(refresh, 0, wx.ALL|wx.EXPAND, 5) self.SetSizer(operationSizer2) def setContacts(self, data = None): self.dataOlv.SetColumns([ ColumnDefn("Name", "left", 220, "name"), ColumnDefn("Telephone", "left", 200, "tel"), ColumnDefn("Fax", "right", 100, "fax") ]) rows = self.db.print_data() contacts = [] for row in rows: contacts.append(Contacts(row[0], str(row[1]), str(row[2]))) self.dataOlv.SetObjects(contacts) def Oninsert(self, evt): dlg = Dialogs(self, u'أدخل بيانات جهة إتصالك ', saveBtn = True) self.setContacts() def Ondelete(self, evt): pass def Onupdate(self, evt): row = self.dataOlv.GetSelectedObject() name = row.name tel = row.tel fax = row.fax Dialogs(None, u'update your contact info', updBtn = True).setValues(name, tel, fax) def getValue(self): row = self.dataOlv.GetSelectedObject() name = row.name return name def Oncreate(self, evt): self.operation.create_table() def onRefresh(self, evt): self.setContacts() class MainFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title = 'my frame') panel = MainPanel(self) filemenu = wx.Menu() filemenu.Append(wx.NewId(), u'&إضافة صنف', u'إضافة صنف جديد') filemenu.AppendSeparator() filemenu.Append(wx.ID_ABOUT, u'&حول', u'حول البرنامج') filemenu.AppendSeparator() filemenu.Append(wx.ID_EXIT, u'&خروج', u'الخروج من البرنامج') menuBar = wx.MenuBar() menuBar.Append(filemenu, u'&ملف') self.SetMenuBar(menuBar) self.Show() app = wx.App() frame = MainFrame() app.MainLoop()