Guest User

Untitled

a guest
Jul 6th, 2018
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 63.86 KB | None | 0 0
  1. from sys import exit
  2. import builtins
  3. import sqlite3
  4. from tkinter import *
  5. import tkinter.ttk as ttk
  6. from tkinter import messagebox
  7. import re
  8.  
  9.  
  10. def vp_start_guilogin():
  11.     '''starts the login screen'''
  12.     global val, w, root
  13.     root = Tk()
  14.     root.title('Login')
  15.     root.geometry('254x151+367+288')
  16.     w = Login (root)
  17.     root.mainloop()
  18.  
  19. def vp_start_gui(database):
  20.     '''Starts the main window'''
  21.     global val, w, root
  22.     root = Tk()
  23.     root.title('Courses and students database. Logged in as: '+database[0:-11])
  24.     root.geometry('1200x600')
  25.  
  26.     w = Courses_and_students_database (root,database)
  27.     root.mainloop()
  28.  
  29. def isin(object_,array):
  30.     '''returns TRUE or FALSE if the object_ is found in the array'''
  31.     i = 0
  32.     found = False
  33.     while i < (len(array)) and not found:
  34.         if object_ == array[i]:
  35.             found = True
  36.         i +=1
  37.     return found
  38.  
  39. def getStrVarValues(StrVars):
  40.     '''returns the string value for a given list of StrVars'''
  41.     StrVarValues = []
  42.     for StrVar in StrVars:
  43.         StrVarValue = StrVar[0].get()
  44.         StrVarValues.append(StrVarValue)
  45.     return StrVarValues
  46.  
  47. def Cleartreeview(tree):
  48.     '''clears a treeview of all data for a given treeview'''
  49.     for i in range(len(tree.get_children())):
  50.         tree.delete(tree.get_children()[0])
  51.  
  52. def populatetreeview(treeview,data):
  53.     '''populates a treeview with given data for a given treeview'''
  54.     Cleartreeview(treeview)
  55.     for i in range(len(data)):
  56.         treeview.focus(treeview.insert('', 0, text=str(i), values=(data[i])))
  57.  
  58. def TODO():
  59.     print("not done yet")
  60.  
  61. class xwidget(ttk.Widget):
  62.     '''a class for creating any type of widget'''
  63.     def __init__(self,object,parent,*places,**kw):
  64.         super(xwidget,self).__init__(parent,object,kw)
  65.         if len(places) == 2:
  66.             self.place(relx=places[0],rely=places[1])
  67.         if len(places) == 4:
  68.             self.place(relx=places[0],rely=places[1],relheight=places[2],relwidth=places[3])
  69.  
  70.  
  71. class Courses_and_students_database:
  72.     '''class for the main window'''
  73.     def __init__(self,master,databasename):
  74.  
  75.         self.conn = sqlite3.connect(databasename)
  76.         self.curs = self.conn.cursor()
  77.         self.set_Tk_var()
  78.         self.createGUI(master)
  79.  
  80.     def createGUI(self,master):
  81.         '''constructs the GUI'''
  82.         style = ttk.Style()
  83.         theme = style.theme_use()
  84.         default = style.lookup(theme, 'background')
  85.         master.configure(background=default)
  86.         #master.resizable(FALSE,FALSE)
  87.         #--------------------------Menu-------------------------------------------------
  88.         self.topmenu = Menu(master,font=('MS Sans Serif',10,'normal','roman',))
  89.         master.configure(menu = self.topmenu)
  90.         self.topmenu_user = Menu(master,tearoff=0,font=('MS Sans Serif',10,'normal','roman',))
  91.         self.topmenu.add_cascade(label="User",menu=self.topmenu_user)
  92.         self.topmenu_user.add_command(label="Logout",command=lambda:self.logout())
  93.         self.topmenu_user.add_separator()
  94.         self.topmenu_user.add_command(label="Change Password",command=TODO())
  95.         #---------------------------main tabs setup----------------------------------------------------
  96.         self.win = ttk.Notebook(master)
  97.         self.win.place(relx=0.0,rely=0.0,relheight=1.01,relwidth=1.01)
  98.         self.win.configure(takefocus="")
  99.         self.win.configure(width="1205")
  100.         self.win.configure(height="606")
  101.  
  102.         self.win_couplepage = Frame(self.win)
  103.         self.win_couplepage.configure(background=default)
  104.         self.win.add(self.win_couplepage, padding=3)
  105.         self.win.tab(0, text="Couples",underline="-1",)
  106.         self.win_coursepage = Frame(self.win)
  107.         self.win_coursepage.configure(background=default)
  108.         self.win.add(self.win_coursepage, padding=3)
  109.         self.win.tab(1, text="Courses",underline="-1",)
  110.         self.win.bind("<<NotebookTabChanged>>",lambda e:self.reloadtreeviews())
  111.         #---------------------------\\Tab one, couples//---------------------------------------------
  112.         self.win_couplepage_displayallbutton = xwidget("ttk::button",self.win_couplepage,0.4,0.78,text="Display all",takefocus="",command= lambda:populatetreeview(self.win_couplepage_coupletreeview,self.getcouples()))
  113.         self.win_couplepage_searchbox = xwidget("ttk::entry",self.win_couplepage,0.18,0.83,0.04,0.21,takefocus="",cursor="ibeam",textvariable=self.searchF)
  114.         self.win_couplepage_searchbutton = xwidget("ttk::button",self.win_couplepage,0.4,0.83,takefocus="",text="Search",command= lambda:populatetreeview(self.win_couplepage_coupletreeview,(self.searchforcouple(int(self.searchV.get()),self.searchF.get()))))
  115.         self.win_couplepage_radiobutton1 = xwidget("ttk::radiobutton",self.win_couplepage,0.03,0.9,0.04,0.08,takefocus="",variable=self.searchV,value="1",text="By surname")
  116.         self.win_couplepage_radiobutton2 = xwidget("ttk::radiobutton",self.win_couplepage,0.13,0.94,0.04,0.12,takefocus="",variable=self.searchV,value="2",text="By phone number")
  117.         self.win_couplepage_radiobutton3 = xwidget("ttk::radiobutton",self.win_couplepage,0.03,0.94,0.04,0.08,takefocus="",variable=self.searchV,value="3",text="By address")
  118.         self.win_couplepage_radiobutton4 = xwidget("ttk::radiobutton",self.win_couplepage,0.13,0.9,0.04,0.08,takefocus="",variable=self.searchV,value="4",text="By firstname")
  119.         self.win_couplepage_radiobutton5 = xwidget("ttk::radiobutton",self.win_couplepage,0.23,0.9,0.04,0.08,takefocus="",variable=self.searchV,value="5",text="By mobile no.")
  120.         self.win_couplepage_radiobutton6 = xwidget("ttk::radiobutton",self.win_couplepage,0.23,0.94,0.04,0.08,takefocus="",variable=self.searchV,value="6",text="By email")
  121.  
  122.         self.win_couplepage_coupletreeview = ScrolledTreeView (self.win_couplepage, columns=('coupleID','Wfirstname','Surname',"Wmobilenumber",'Wemailaddress','Pfirstname',"Psurname","Pmobilenumber","Pemailaddress"),show="headings")
  123.         self.win_couplepage_coupletreeview.place(relx=0.02,rely=0.02,relheight=0.75
  124.                 ,relwidth=0.45)
  125.         self.win_couplepage_coupletreeview.configure(takefocus="0")
  126.         self.win_couplepage_coupletreeview.configure(height="4")
  127.         self.win_couplepage_coupletreeview.configure(takefocus="0")
  128.         self.win_couplepage_coupletreeview.column(0, width=65, anchor='center')
  129.         self.win_couplepage_coupletreeview.column(1, width=90, anchor='center')
  130.         self.win_couplepage_coupletreeview.column(2, width=90, anchor='center')
  131.         self.win_couplepage_coupletreeview.column(3, width=90, anchor='center')
  132.         self.win_couplepage_coupletreeview.column(4, width=90, anchor='center')
  133.         self.win_couplepage_coupletreeview.column(5, width=90, anchor='center')
  134.         self.win_couplepage_coupletreeview.column(6, width=120, anchor='center')
  135.         self.win_couplepage_coupletreeview.column(7, width=90, anchor='center')
  136.         self.win_couplepage_coupletreeview.column(8, width=90, anchor='center')
  137.         self.win_couplepage_coupletreeview.heading('coupleID', text='Couple ID')
  138.         self.win_couplepage_coupletreeview.heading('Wfirstname', text="Woman's name")
  139.         self.win_couplepage_coupletreeview.heading('Surname', text="Surname")
  140.         self.win_couplepage_coupletreeview.heading("Wmobilenumber", text='Mobile no.')
  141.         self.win_couplepage_coupletreeview.heading('Pfirstname', text="Partner's name")
  142.         self.win_couplepage_coupletreeview.heading('Psurname', text="Surname")
  143.         self.win_couplepage_coupletreeview.heading('Pmobilenumber', text="Mobile no.")
  144.         self.win_couplepage_coupletreeview.heading('Pemailaddress', text="Email address")
  145.         self.win_couplepage_coupletreeview.heading('Wemailaddress', text="Email address")
  146.         self.win_couplepage_coupletreeview.bind("<<TreeviewSelect>>",lambda e:self.couplesshowdetails())
  147.  
  148.  
  149.         self.win_couplepage_addcouplebutton = xwidget("ttk::button",self.win_couplepage,0.06,0.78,takefocus="",text="Add couple",command=lambda:self.addupdate([self.getidno(0,self.couplesdb)],self.fieldlist,"Couples",self.reloadcouples))
  150.         self.win_couplepage_removecouplebutton = xwidget("ttk::button",self.win_couplepage,0.13,0.78,takefocus="",text="Remove couple",command=lambda:self.removeupdate(self.fieldlist,"Couples","CouplesID",self.reloadcouples,self.win_couplepage_editcoupleframe_notesframe_notestextbox))
  151.  
  152.         self.win_couplepage_editcoupleframe = xwidget("ttk::labelframe",self.win_couplepage,0.48,0.02,0.96,0.5,text="Edit couple",width="605",height="555",takefocus="0")
  153.         self.win_couplepage_editcoupleframe_savebutton = xwidget("ttk::button",self.win_couplepage_editcoupleframe,0.02,0.94,command=lambda:self.editupdate(self.fieldlist,"Couples",self.reloadcouples,self.win_couplepage_editcoupleframe_notesframe_notestextbox),text="Save")
  154.         self.win_couplepage_editcoupleframe_clearfieldsbutton = xwidget("ttk::button",self.win_couplepage_editcoupleframe,0.2,0.94,takefocus="",text="Clear",command=lambda:self.Clearentries())
  155.  
  156.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook = ttk.Notebook(self.win_couplepage_editcoupleframe)
  157.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook.place(relx=0.02,rely=0.01,relheight=0.64
  158.                 ,relwidth=0.97)
  159.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook.configure(takefocus="",width="584",height="356")
  160.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab = Frame(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook)
  161.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab.configure(background=default)
  162.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook.add(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab, padding=3)
  163.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook.tab(0, text="Contact Details",underline="-1",)
  164.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab = Frame(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook)
  165.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab.configure(background=default)
  166.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook.add(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab, padding=3)
  167.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook.tab(1, text="Courses",underline="-1",)
  168.  
  169.  
  170.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe = xwidget("ttk::labelframe",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab,0.02,0.03,0.44,0.46,text="Woman",width="265",height="315")
  171.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_firstnamelabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.0,0.02,0.17,0.23,text="Firstname")
  172.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_firstnameentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.35,0.03,0.17,0.61,takefocus="",textvariable=self.Wfirstname[0],cursor="ibeam")
  173.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_surnamelabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.0,0.26,0.17,0.21,text="Surname")
  174.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_surnameentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.35,0.28,0.17,0.61,takefocus="",textvariable=self.Wsurname[0],cursor="ibeam")
  175.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_mobilenumberlabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.0,0.5,0.17,0.35,text="Mobile number")
  176.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_mobilenumberentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.35,0.51,0.17,0.61,takefocus="",textvariable=self.Wmobilenumber[0],cursor="ibeam")
  177.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_emaillabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.0,0.74,0.17,0.31,text="Email address")
  178.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe_emailentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_womanframe,0.35,0.75,0.17,0.61,takefocus="",textvariable=self.Wemailaddress[0],cursor="ibeam")
  179.  
  180.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe = xwidget("ttk::labelframe",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab,0.48,0.03,0.44,0.51,text="Partner",width="295",height="145")
  181.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_firstnamelabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.0,0.02,0.17,0.23,text="Firstname")
  182.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_firstnameentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.35,0.03,0.17,0.61,takefocus="",textvariable=self.Pfirstname[0],cursor="ibeam")
  183.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_surnamelabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.0,0.26,0.17,0.21,text="Surname")
  184.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_surnameentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.35,0.28,0.17,0.61,takefocus="",textvariable=self.Psurname[0],cursor="ibeam")
  185.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_mobilenumberlabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.0,0.5,0.17,0.35,text="Mobile number")
  186.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_mobilenumberentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.35,0.51,0.17,0.61,takefocus="",textvariable=self.Pmobilenumber[0],cursor="ibeam")
  187.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_emaillabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.0,0.74,0.17,0.31,text="Email address")
  188.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe_emailentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_partnerframe,0.35,0.75,0.17,0.61,takefocus="",textvariable=self.Pemailaddress[0],cursor="ibeam")
  189.  
  190.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe = xwidget("ttk::labelframe",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab,0.48,0.48,0.5,0.51,text="Home address",width="295",height="165")
  191.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_line1label = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.05,0.12,relief="flat",text="Line 1")
  192.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_line1entry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.24,0.12,0.13,0.66,takefocus="",textvariable=self.address_line1[0],cursor="ibeam")
  193.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_line2label = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.05,0.3,relief="flat",text="Line 2")
  194.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_line2entry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.24,0.3,0.13,0.66,takefocus="",textvariable=self.address_line2[0],cursor="ibeam")
  195.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_townlabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.05,0.48,relief="flat",text="Town")
  196.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_townentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.24,0.48,0.13,0.66,takefocus="",textvariable=self.address_town[0],cursor="ibeam")
  197.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_countylabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.05,0.67,relief="flat",text="County")
  198.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_countyentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.24,0.67,0.13,0.66,takefocus="",textvariable=self.address_county[0],cursor="ibeam")
  199.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_postcodelabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.05,0.85,relief="flat",text="Postcode")
  200.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe_postcodeentry = xwidget("ttk::entry",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_addressframe,0.24,0.85,0.13,0.66,takefocus="",textvariable=self.address_postcode[0],cursor="ibeam")
  201.  
  202.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_avaiablecourseslabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab,0.14,0.02,relief="flat",text="Available Courses")
  203.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview = ScrolledTreeView (self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab, columns=('courseid','coursetype','cstartdate','cenddate'),show="headings")
  204.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.place(relx=0.01,rely=0.09
  205.                 ,relheight=0.9,relwidth=0.41)
  206.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.configure(height="4")
  207.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.configure(takefocus="ttk::takefocus")
  208.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.column(0, width=75, anchor='center')
  209.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.column(1, width=75, anchor='center')
  210.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.column(2, width=75, anchor='center')
  211.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.column(3, width=75, anchor='center')
  212.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.heading('courseid', text='Course no')
  213.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.heading('coursetype', text='Course type')
  214.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.heading('cstartdate', text="Start date")
  215.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.heading('cenddate', text="End date")
  216.  
  217.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_detailstab_enrolledcourseslabel = xwidget("ttk::label",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab,0.72,0.02,relief="flat",text="Enrolled Courses")
  218.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview = ScrolledTreeView (self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab, columns=('courseid','coursetype','cstartdate','cenddate'),show="headings")
  219.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.place(relx=0.58,rely=0.09
  220.                 ,relheight=0.9,relwidth=0.41)
  221.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.configure(height="4")
  222.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.configure(takefocus="ttk::takefocus")
  223.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.column(0, width=75, anchor='center')
  224.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.column(1, width=75, anchor='center')
  225.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.column(2, width=75, anchor='center')
  226.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.column(3, width=75, anchor='center')
  227.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.heading('courseid', text='Course no')
  228.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.heading('coursetype', text='Course type')
  229.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.heading('cstartdate', text="Start date")
  230.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.heading('cenddate', text="End date")
  231.  
  232.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolbutton = xwidget("ttk::button",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab,0.43,0.47,text="Enroll =>",command=lambda:self.enrollupdate(self.coupleID,self.Acourses[len(self.Acourses)-self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.index(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview.focus())-1][0]))
  233.         self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_unenrolbutton = xwidget("ttk::button",self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab,0.43,0.56,text="<= Unenroll",command=lambda:self.unenrollupdate(self.coupleID,self.Ecourses[len(self.Ecourses)-self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.index(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview.focus())-1][0]))
  234.  
  235.         self.win_couplepage_editcoupleframe_notesframe = xwidget("ttk::labelframe",self.win_couplepage_editcoupleframe,0.02,0.68,0.24,0.97,text="Notes",width="585",height="135")
  236.  
  237.         self.win_couplepage_editcoupleframe_notesframe_notestextbox = ScrolledText (self.win_couplepage_editcoupleframe_notesframe)
  238.         self.win_couplepage_editcoupleframe_notesframe_notestextbox.place(relx=0.02,rely=0.15,relheight=0.81
  239.                 ,relwidth=0.96)
  240.         self.win_couplepage_editcoupleframe_notesframe_notestextbox.configure(background="white")
  241.         self.win_couplepage_editcoupleframe_notesframe_notestextbox.configure(height="3")
  242.         self.win_couplepage_editcoupleframe_notesframe_notestextbox.configure(width="10")
  243.  
  244.         #------------------------\\\Tab two courses///-------------------------------
  245.         self.win_coursepage_coursetreeview = ScrolledTreeView (self.win_coursepage, columns=('courseID','coursetype','cstartdate','cenddate',"cvenue",'cnumberofcouples'),show="headings")
  246.         self.win_coursepage_coursetreeview.place(relx=0.02,rely=0.02,relheight=0.45,relwidth=0.45)
  247.         self.win_coursepage_coursetreeview.configure(takefocus="0")
  248.         self.win_coursepage_coursetreeview.configure(height="4")
  249.         self.win_coursepage_coursetreeview.configure(takefocus="0")
  250.         self.win_coursepage_coursetreeview.column(0, width=65, anchor='center')
  251.         self.win_coursepage_coursetreeview.column(1, width=90, anchor='center')
  252.         self.win_coursepage_coursetreeview.column(2, width=90, anchor='center')
  253.         self.win_coursepage_coursetreeview.column(3, width=90, anchor='center')
  254.         self.win_coursepage_coursetreeview.column(4, width=90, anchor='center')
  255.         self.win_coursepage_coursetreeview.column(5, width=90, anchor='center')
  256.         self.win_coursepage_coursetreeview.heading('courseID', text='ID')
  257.         self.win_coursepage_coursetreeview.heading('coursetype', text='Course type')
  258.         self.win_coursepage_coursetreeview.heading('cstartdate', text="Start date")
  259.         self.win_coursepage_coursetreeview.heading('cenddate', text="End date")
  260.         self.win_coursepage_coursetreeview.heading("cvenue", text='Venue')
  261.         self.win_coursepage_coursetreeview.heading('cnumberofcouples', text="No. of Couples")
  262.         self.win_coursepage_coursetreeview.bind("<<TreeviewSelect>>",lambda e:self.coursesshowdetails())
  263.  
  264.         self.win_coursepage_savecoursebutton = xwidget("ttk::button",self.win_coursepage,0.03,0.48,takefocus="",text="Save",command=lambda:self.editupdate(self.coursefieldlist,"Courses",self.reloadcourses,self.win_coursepage_coursenotesframe_notestextbox))
  265.         self.win_coursepage_addcoursebutton = xwidget("ttk::button",self.win_coursepage,0.095,0.48,takefocus="",text="Add course",command=lambda:self.addupdate([self.getidno(0,self.getcourses())],self.getcourses(),self.coursefieldlist,"Courses",self.reloadcourses))
  266.         self.win_coursepage_removecoursebutton = xwidget("ttk::button",self.win_coursepage,0.16,0.48,takefocus="",text="Remove course",command=lambda:self.removeupdate(self.coursefieldlist,"Courses","CoursesID",self.reloadcourses,self.win_coursepage_coursenotesframe_notestextbox))
  267.  
  268.         self.win_coursepage_editclassframe = xwidget("ttk::labelframe",self.win_coursepage,0.48,0.02,0.96,0.5,text="Edit Classes",width="605",height="555",takefocus="0")
  269.  
  270.         self.win_coursepage_editclassframe_classtreeview = ScrolledTreeView (self.win_coursepage_editclassframe, columns=('Classno','Classname','Classdate','Classtimestart',"Classtimeend"),show="headings")
  271.         self.win_coursepage_editclassframe_classtreeview.place(relx=0.02,rely=0.02,relheight=0.5,relwidth=0.96)
  272.         self.win_coursepage_editclassframe_classtreeview.configure(takefocus="0")
  273.         self.win_coursepage_editclassframe_classtreeview.configure(height="4")
  274.         self.win_coursepage_editclassframe_classtreeview.configure(takefocus="0")
  275.         self.win_coursepage_editclassframe_classtreeview.column(0, width=65, anchor='center')
  276.         self.win_coursepage_editclassframe_classtreeview.column(1, width=90, anchor='center')
  277.         self.win_coursepage_editclassframe_classtreeview.column(2, width=90, anchor='center')
  278.         self.win_coursepage_editclassframe_classtreeview.column(3, width=90, anchor='center')
  279.         self.win_coursepage_editclassframe_classtreeview.column(4, width=90, anchor='center')
  280.         self.win_coursepage_editclassframe_classtreeview.heading('Classno', text='Class No')
  281.         self.win_coursepage_editclassframe_classtreeview.heading('Classname', text='Class Name')
  282.         self.win_coursepage_editclassframe_classtreeview.heading('Classdate', text="Class date")
  283.         self.win_coursepage_editclassframe_classtreeview.heading('Classtimestart', text="Start time")
  284.         self.win_coursepage_editclassframe_classtreeview.heading("Classtimeend", text='End time')
  285.         self.win_coursepage_editclassframe_classtreeview.bind("<<TreeviewSelect>>",lambda e:self.Classshowdetails())
  286.  
  287.         self.win_coursepage_editclassframe_Classnotesframe = xwidget("ttk::labelframe",self.win_coursepage_editclassframe,0.005,0.7,0.3,0.99,text="Class notes",width="605",height="555",takefocus="0")
  288.         self.win_coursepage_editclassframe_Classnotesframe_notestextbox = ScrolledText (self.win_coursepage_editclassframe_Classnotesframe)
  289.         self.win_coursepage_editclassframe_Classnotesframe_notestextbox.place(relx=0.01,rely=0.05,relheight=0.9,relwidth=0.98)
  290.         self.win_coursepage_editclassframe_Classnotesframe_notestextbox.configure(background="white",height="3",width="10")
  291.  
  292.         self.win_coursepage_editclassframe_classdatelabel = xwidget("ttk::label",self.win_coursepage_editclassframe,0.05,0.64,relief="flat",text="Class date                  /                    /")
  293.         self.win_coursepage_editclassframe_classdatedaycombobox = xwidget("ttk::combobox",self.win_coursepage_editclassframe,0.19,0.64,0.04,0.07,values=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31),takefocus="",textvariable=self.Classdateday[0])
  294.         self.win_coursepage_editclassframe_classdatemonthcombobox = xwidget("ttk::combobox",self.win_coursepage_editclassframe,0.29,0.64,0.04,0.07,values=(1,2,3,4,5,6,7,8,9,10,11,12),takefocus="",textvariable=self.Classdatemonth[0])
  295.         self.win_coursepage_editclassframe_classdateyearcombobox = xwidget("ttk::combobox",self.win_coursepage_editclassframe,0.39,0.64,0.04,0.09,values=(2011,2012,2013,2014),takefocus="",textvariable=self.Classdateyear[0])
  296.  
  297.         self.win_coursepage_startdatelabel = xwidget("ttk::label",self.win_coursepage,0.02,0.62,relief="flat",text="Start date                   /                  /")
  298.         self.win_coursepage_startdatedaycombobox = xwidget("ttk::combobox",self.win_coursepage,0.07,0.62,0.04,0.035,values=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31),takefocus="",textvariable=self.startdateday[0])
  299.         self.win_coursepage_startdatemonthcombobox = xwidget("ttk::combobox",self.win_coursepage,0.12,0.62,0.04,0.035,values=(1,2,3,4,5,6,7,8,9,10,11,12),takefocus="",textvariable=self.startdatemonth[0])
  300.         self.win_coursepage_startdateyearcombobox = xwidget("ttk::combobox",self.win_coursepage,0.17,0.62,0.04,0.055,values=(2011,2012,2013,2014),takefocus="",textvariable=self.startdateyear[0])
  301.  
  302.         self.win_coursepage_enddatelabel = xwidget("ttk::label",self.win_coursepage,0.02,0.68,relief="flat",text="End date                    /                  /")
  303.         self.win_coursepage_enddatedaycombobox = xwidget("ttk::combobox",self.win_coursepage,0.07,0.68,0.04,0.035,values=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31),takefocus="",textvariable=self.enddateday[0])
  304.         self.win_coursepage_enddatemonthcombobox = xwidget("ttk::combobox",self.win_coursepage,0.12,0.68,0.04,0.035,values=(1,2,3,4,5,6,7,8,9,10,11,12),takefocus="",textvariable=self.enddatemonth[0])
  305.         self.win_coursepage_enddateyearcombobox = xwidget("ttk::combobox",self.win_coursepage,0.17,0.68,0.04,0.055,values=(2011,2012,2013,2014),takefocus="",textvariable=self.enddateyear[0])
  306.  
  307.         self.win_coursepage_coursenotesframe = xwidget("ttk::labelframe",self.win_coursepage,0.005,0.73,0.23,0.47,text="Course notes",width="605",height="555",takefocus="0")
  308.         self.win_coursepage_coursenotesframe_notestextbox = ScrolledText (self.win_coursepage_coursenotesframe)
  309.         self.win_coursepage_coursenotesframe_notestextbox.place(relx=0.01,rely=0.05,relheight=0.9,relwidth=0.98)
  310.         self.win_coursepage_coursenotesframe_notestextbox.configure(background="white",height="3",width="10")
  311.  
  312.         self.win_coursepage_editclassframe_starttimelabel = xwidget("ttk::label",self.win_coursepage_editclassframe,0.54,0.54,relief="flat",text="Start time")
  313.         self.win_coursepage_editclassframe_endtimelabel = xwidget("ttk::label",self.win_coursepage_editclassframe,0.54,0.64,relief="flat",text="End time")
  314.         self.win_coursepage_editclassframe_starttimecombobox = xwidget("ttk::combobox",self.win_coursepage_editclassframe,0.65,0.54,0.04,0.155,values=('00:00','00:15','00:30','00:45','01:00','01:15','01:30','01:45','02:00','02:15','02:30','02:45','03:00','03:15','03:30','03:45','04:00','04:15','04:30','04:45','05:00','05:15','05:30','05:45','06:00','06:15','06:30','06:45','07:00','07:15','07:30','07:45','08:00','08:15','08:30','08:45','09:00','09:15','09:30','09:45','10:00','10:15','10:30','10:45','11:00','11:15','11:30','11:45','12:00','12:15','12:30','12:45','13:00','13:15','13:30','13:45','14:00','14:15','14:30','14:45','15:00','15:15','15:30','15:45','16:00','16:15','16:30','16:45','17:00','17:15','17:30','17:45','18:00','18:15','18:30','18:45','19:00','19:15','19:30','19:45','20:00','20:15','20:30','20:45','21:00','21:15','21:30','21:45','22:00','22:15','22:30','22:45','23:00','23:15','23:30','23:45'),takefocus="",textvariable=self.Classstarttime[0])
  315.         self.win_coursepage_editclassframe_endtimecombobox = xwidget("ttk::combobox",self.win_coursepage_editclassframe,0.65,0.64,0.04,0.155,values=('00:00','00:15','00:30','00:45','01:00','01:15','01:30','01:45','02:00','02:15','02:30','02:45','03:00','03:15','03:30','03:45','04:00','04:15','04:30','04:45','05:00','05:15','05:30','05:45','06:00','06:15','06:30','06:45','07:00','07:15','07:30','07:45','08:00','08:15','08:30','08:45','09:00','09:15','09:30','09:45','10:00','10:15','10:30','10:45','11:00','11:15','11:30','11:45','12:00','12:15','12:30','12:45','13:00','13:15','13:30','13:45','14:00','14:15','14:30','14:45','15:00','15:15','15:30','15:45','16:00','16:15','16:30','16:45','17:00','17:15','17:30','17:45','18:00','18:15','18:30','18:45','19:00','19:15','19:30','19:45','20:00','20:15','20:30','20:45','21:00','21:15','21:30','21:45','22:00','22:15','22:30','22:45','23:00','23:15','23:30','23:45'),takefocus="",textvariable=self.Classendtime[0])
  316.  
  317.         self.win_coursepage_editclassframe_saveclassbutton = xwidget("ttk::button",self.win_coursepage_editclassframe,0.04,0.53,takefocus="",text="Save",command=lambda:self.editupdate(self.Classfieldlist,"Classes",self.reloadclasses,self.win_coursepage_editclassframe_Classnotesframe_notestextbox))
  318.         self.win_coursepage_editclassframe_addclassbutton = xwidget("ttk::button",self.win_coursepage_editclassframe,0.171,0.53,takefocus="",text="Add Class",command=lambda:self.addupdate([self.getidno(0,self.getClasses()),self.courseID[0].get(),self.getidno(2,self.Classesresults)],self.Classfieldlist,"Classes",self.reloadclasses))
  319.         self.win_coursepage_editclassframe_deleteclassbutton = xwidget("ttk::button",self.win_coursepage_editclassframe,0.3,0.53,takefocus="",text="Remove Class",command=lambda:self.removeupdate(self.Classfieldlist,"Classes","ClassID",self.reloadclasses,self.win_coursepage_editclassframe_Classnotesframe_notestextbox))
  320.         self.win_coursepage_editclassframe_classnamelabel = xwidget("ttk::label",self.win_coursepage_editclassframe,0.05,0.59,relief="flat",text="Class name")
  321.         self.win_coursepage_editclassframe_classnameentry = xwidget("ttk::entry",self.win_coursepage_editclassframe,0.19,0.59,0.04,0.3,takefocus="",textvariable=self.Classname[0],cursor="ibeam")
  322.  
  323.         self.win_coursepage_coursetypelabel = xwidget("ttk::label",self.win_coursepage,0.02,0.56,relief="flat",text="Course type")
  324.         self.win_coursepage_tNo35_pg0_cpd77_tEn63 = xwidget("ttk::entry",self.win_coursepage,0.08,0.56,0.04,0.14,takefocus="",textvariable=self.coursetype[0],cursor="ibeam")
  325.  
  326.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77 = xwidget("ttk::labelframe",self.win_coursepage,0.25,0.47,0.25,0.22,text="Venue address",width="295",height="165")
  327.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tLa69 = xwidget("ttk::label",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.05,0.04,relief="flat",text="Line 1")
  328.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tEn63 = xwidget("ttk::entry",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.25,0.04,0.13,0.74,takefocus="",textvariable=self.venuel1[0],cursor="ibeam")
  329.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tLa70 = xwidget("ttk::label",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.05,0.23,relief="flat",text="Line 2")
  330.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tEn72 = xwidget("ttk::entry",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.25,0.23,0.13,0.74,takefocus="",textvariable=self.venuel2[0],cursor="ibeam")
  331.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tLa65 = xwidget("ttk::label",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.05,0.42,relief="flat",text="Town")
  332.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tEn73 = xwidget("ttk::entry",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.25,0.42,0.13,0.74,takefocus="",textvariable=self.venuet[0],cursor="ibeam")
  333.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tLa66 = xwidget("ttk::label",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.05,0.61,relief="flat",text="County")
  334.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tEn74 = xwidget("ttk::entry",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.25,0.61,0.13,0.74,takefocus="",textvariable=self.venuec[0],cursor="ibeam")
  335.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tLa67 = xwidget("ttk::label",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.05,0.8,relief="flat",text="Postcode")
  336.         self.win_coursepage_editclassframe_tNo35_pg0_cpd77_tEn75 = xwidget("ttk::entry",self.win_coursepage_editclassframe_tNo35_pg0_cpd77,0.25,0.8,0.13,0.74,takefocus="",textvariable=self.venuep[0],cursor="ibeam")
  337.  
  338.     def couplesshowdetails(self):
  339.         '''will retrieve the data for the selected record chosen by the treeview'''
  340.         recno =len(self.couplesdb)- self.win_couplepage_coupletreeview.index(self.win_couplepage_coupletreeview.focus()) -1
  341.         self.coupleID[0].set(self.couplesdb[recno][0])
  342.         self.Wfirstname[0].set(self.couplesdb[recno][1])
  343.         self.Wsurname[0].set(self.couplesdb[recno][2])
  344.         self.Wmobilenumber[0].set(self.couplesdb[recno][3])
  345.         self.Wemailaddress[0].set(self.couplesdb[recno][4])
  346.         self.Pfirstname[0].set(self.couplesdb[recno][5])
  347.         self.Psurname[0].set(self.couplesdb[recno][6])
  348.         self.Pmobilenumber[0].set(self.couplesdb[recno][7])
  349.         self.Pemailaddress[0].set(self.couplesdb[recno][8])
  350.         self.address_line1[0].set(self.couplesdb[recno][9])
  351.         self.address_line2[0].set(self.couplesdb[recno][10])
  352.         self.address_town[0].set(self.couplesdb[recno][11])
  353.         self.address_county[0].set(self.couplesdb[recno][12])
  354.         self.address_postcode[0].set(self.couplesdb[recno][13])
  355.         self.notescouple[0].set(self.couplesdb[recno][14])
  356.         self.win_couplepage_editcoupleframe_notesframe_notestextbox.delete('1.0', 'end')
  357.         self.win_couplepage_editcoupleframe_notesframe_notestextbox.insert('1.0',self.notescouple[0].get())
  358.         self.reloadenrollments()
  359.  
  360.     def coursesshowdetails(self):
  361.         '''will retrieve the data for the selected record chosen by the treeview'''
  362.         recno =len(self.coursesdb)- self.win_coursepage_coursetreeview.index(self.win_coursepage_coursetreeview.focus()) -1
  363.         self.courseID[0].set(self.coursesdb[recno][0])
  364.         self.coursetype[0].set(self.coursesdb[recno][1])
  365.         self.startdateday[0].set(self.coursesdb[recno][2])
  366.         self.enddateday[0].set(self.coursesdb[recno][3])
  367.         self.startdatemonth[0].set(self.coursesdb[recno][4])
  368.         self.enddatemonth[0].set(self.coursesdb[recno][5])
  369.         self.startdateyear[0].set(self.coursesdb[recno][6])
  370.         self.enddateyear[0].set(self.coursesdb[recno][7])
  371.         self.venuel1[0].set(self.coursesdb[recno][8])
  372.         self.venuel2[0].set(self.coursesdb[recno][9])
  373.         self.venuet[0].set(self.coursesdb[recno][10])
  374.         self.venuec[0].set(self.coursesdb[recno][11])
  375.         self.venuep[0].set(self.coursesdb[recno][12])
  376.         self.notescourse[0].set(self.coursesdb[recno][13])
  377.  
  378.         self.win_coursepage_coursenotesframe_notestextbox.delete('1.0', 'end')
  379.         self.win_coursepage_coursenotesframe_notestextbox.insert('1.0',self.notescourse[0].get())
  380.         self.reloadclasses()
  381.  
  382.     def Classshowdetails(self):
  383.         '''will retrieve the data for the selected record chosen by the treeview'''
  384.         recno =len(self.Classesresults)- self.win_coursepage_editclassframe_classtreeview.index(self.win_coursepage_editclassframe_classtreeview.focus()) -1
  385.         self.ClassuniqueID[0].set(self.Classesresults[recno][0])
  386.         self.Classid[0].set(self.Classesresults[recno][2])
  387.         self.Classname[0].set(self.Classesresults[recno][3])
  388.         self.Classdateday[0].set(self.Classesresults[recno][4])
  389.         self.Classdatemonth[0].set(self.Classesresults[recno][5])
  390.         self.Classdateyear[0].set(self.Classesresults[recno][6])
  391.         self.Classstarttime[0].set(self.Classesresults[recno][7])
  392.         self.Classendtime[0].set(self.Classesresults[recno][8])
  393.         self.Classnotes[0].set(self.Classesresults[recno][9])
  394.         self.win_coursepage_editclassframe_Classnotesframe_notestextbox.delete('1.0', 'end')
  395.         self.win_coursepage_editclassframe_Classnotesframe_notestextbox.insert('1.0',self.Classnotes[0].get())
  396.  
  397.     def reloadtreeviews(self):
  398.         '''will reload the couples treeview and the courses treeview'''
  399.         populatetreeview(self.win_couplepage_coupletreeview,self.getcouples())
  400.         populatetreeview(self.win_coursepage_coursetreeview,self.getcoursetreeviewdata(self.getcourses(),0,-1))
  401.  
  402.  
  403.  
  404.     def reloadcouples(self):
  405.         '''will reload the couples treeview and the courses treeview'''
  406.         populatetreeview(self.win_couplepage_coupletreeview,self.getcouples())
  407.  
  408.     def reloadcourses(self):
  409.         '''will reload the courses treeview'''
  410.         populatetreeview(self.win_coursepage_coursetreeview,self.getcoursetreeviewdata(self.getcourses(),0,-1))
  411.  
  412.     def reloadclasses(self):
  413.         '''will reload the classes treeview'''
  414.         populatetreeview(self.win_coursepage_editclassframe_classtreeview,self.getClasstreeviewdata(self.searchClasses(self.courseID)))
  415.  
  416.     def reloadenrollments(self):
  417.         populatetreeview(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_avaiablecoursestreeview,self.getcoursetreeviewdata(self.getavaiblecourses(self.coupleID[0].get()),0,4))
  418.         populatetreeview(self.win_couplepage_editcoupleframe_detailsandrenollmentnotebook_enrollmenttab_enrolledcoursestreeview,self.getcoursetreeviewdata(self.getenrolledcourses(self.coupleID[0].get()),0,4))
  419.  
  420.  
  421.     def getcoursetreeviewdata(self,data1,no1,no2):
  422.         '''will retreive the data for courses to populate the treeviews and then will arange it with the option to change what data you want'''
  423.         data2 = []
  424.         for i in range(len(data1)):
  425.             data2.append((data1[i][0],data1[i][1],self.concatonatedate(data1[i][2],data1[i][4],data1[i][6]),self.concatonatedate(data1[i][3],data1[i][5],data1[i][7]),data1[i][12],0)[no1:no2])
  426.         return data2
  427.  
  428.     def getClasstreeviewdata(self,data1):
  429.         '''will retreive the data for classes to populate the treeviews and then will arange it'''
  430.         data2 = []
  431.         for data in data1:
  432.             data2.append((data[2],data[3],self.concatonatedate(data[4],data[5],data[6]),data[7],data[8]))
  433.         return data2
  434.  
  435.     def editupdate(self,fieldlist,table,func,notes):
  436.         '''will save the changes to the current record in the given table  and then call the function called func, when i have called this function it has been to update the treeview according to the function passed'''
  437.         self.updatetext(notes,fieldlist[-1])
  438.         if self.validates(fieldlist):
  439.             self.editrecord(fieldlist,table)
  440.             func()
  441.  
  442.     def removeupdate(self,fieldlist,table,primarykey,func,notes):
  443.         '''will remove the current record in the given table  and then call the function called func, when i have called this function it has been to update the treeview according to the function passed'''
  444.         self.updatetext(notes,fieldlist[-1])
  445.         self.deleterecord(fieldlist,table,primarykey)
  446.         func()
  447.  
  448.     def addupdate(self,idno,fieldlist,table,func):
  449.         '''will add a new record in the given table and then call the function called func, when i have called this function the func has been to update the treeview according to the function passed'''
  450.         self.newrecord(idno,fieldlist,table)
  451.         func()
  452.  
  453.     def enrollupdate(self,CouplesID,CoursesID):
  454.         '''will add a new enrolment record to the enrollments table and then update the treeviews'''
  455.         self.enroll(CouplesID,CoursesID)
  456.         self.reloadenrollments()
  457.  
  458.     def unenrollupdate(self,CouplesID,CoursesID):
  459.         '''will remove the selected enrolment record to the enrollments table and then update the treeviews'''
  460.         self.unenroll(CouplesID,CoursesID)
  461.         self.reloadenrollments()
  462.  
  463.     def getcouples(self):
  464.         '''will fetch and then return all the couples from the couples database and order them by the CouplesID in descending order'''
  465.         self.curs.execute('select * from Couples ORDER BY CouplesID DESC')
  466.         self.couplesdb = self.curs.fetchall()
  467.         return self.couplesdb
  468.  
  469.     def getcourses(self):
  470.         '''will fetch and then return all the Courses from the courses database and order them by the coursesID in ascending order'''
  471.         self.curs.execute('select * from Courses ORDER BY CoursesID ASC')
  472.         self.coursesdb = self.curs.fetchall()
  473.         return self.coursesdb
  474.  
  475.     def getClasses(self):
  476.         '''will fetch and then return all the Classes  from the Classes  database and order them by the Classes ID in descending order'''
  477.         self.curs.execute('select * from Classes ORDER BY ClassID DESC')
  478.         self.Classesdb = self.curs.fetchall()
  479.         return self.Classesdb
  480.  
  481.     def searchClasses(self,courseid):
  482.         '''will fetch and then return all the Classes with the matching CoursesID from the Classes  database and order them by the Classes ID in descending order'''
  483.         self.curs.execute('select * from Classes where CoursesID=? ORDER BY ClassesID DESC',[courseid[0].get()])
  484.         self.Classesresults = self.curs.fetchall()
  485.         return self.Classesresults
  486.  
  487.     def getidno(self,no,array):
  488.         '''will return the smallest free id number at the position given by no in an array'''
  489.         i = []
  490.         for arr in array:
  491.             i.append(arr[no])
  492.         x = 1
  493.         while isin(x,i):
  494.             x += 1
  495.         return x
  496.  
  497.     def newrecord(self,existingdata,fieldlist,table):
  498.         '''will creata a new record using the dataprovided in the given table and will fill in the remaining fields with blanks'''
  499.         valuesstr = ' values(?'
  500.         blankdata = existingdata
  501.         while (len(blankdata) < len(fieldlist)):
  502.             blankdata.append("")
  503.         j = 2
  504.         for j in range(len(fieldlist)-1):
  505.             valuesstr+=',?'
  506.         valuesstr+=')'
  507.         try:
  508.             self.curs.execute('insert into '+table+valuesstr,blankdata)
  509.             self.conn.commit()
  510.         except:
  511.             pass
  512.  
  513.     def editrecord(self,fieldlist,table):
  514.         '''will edit the matching record in the given table'''
  515.         query = "REPLACE INTO "+table+" values(?"
  516.         for i in range(len(fieldlist)-1):
  517.             query+=',?'
  518.         query+= ")"
  519.         editvalues = getStrVarValues(fieldlist)
  520.         try:
  521.             self.curs.execute(query,editvalues)
  522.             self.conn.commit()
  523.         except:
  524.             pass
  525.  
  526.     def deleterecord(self,fieldlist,table,primarykey):
  527.         '''will delete the matching record in the given database'''
  528.         query = "DELETE FROM "+table+" where "+primarykey+" =?"
  529.         values = getStrVarValues(fieldlist)
  530.         idvalue = values[0]
  531.         try:
  532.             self.curs.execute(query,[idvalue])
  533.             self.conn.commit()
  534.         except:
  535.             pass
  536.  
  537.     def searchforcouple(self,fieldno,searchvalue):
  538.         '''will search the couples table for the matching record for the given field'''
  539.         fieldlist =[0,("Wsurname","Msurname"),("Homenumber","Homenumber"),("Apostcode","Apostcode"),("Wfirstname","Mfirstname"),("Wmobilenumber","Mmobilenumber"),("Wemailaddress","Memailaddress")]
  540.         self.curs.execute('select * from Couples where '+fieldlist[fieldno][0]+'=? OR '+fieldlist[fieldno][1]+'=?',[searchvalue,searchvalue])
  541.         queryResult = self.curs.fetchall()
  542.         return queryResult
  543.  
  544.     def getenrolledcourses(self,coupleID):
  545.         '''will return the courses that the given couple has been enrolled on'''
  546.         self.curs.execute('select * from Enrollment where CouplesID =?',[coupleID])
  547.         enrolments = self.curs.fetchall()
  548.         self.Ecourses = []
  549.         for i in range(len(enrolments)):
  550.             self.curs.execute('select * from Courses where CoursesID =?',[enrolments[i][1]])
  551.             courses = self.curs.fetchall()
  552.             for j in range(len(courses)):
  553.                 self.Ecourses.append(courses[j])
  554.         return self.Ecourses
  555.  
  556.     def getavaiblecourses(self,coupleID):
  557.         '''will return the courses that the given couple has not been enrolled on'''
  558.         allcourses = self.getcourses()
  559.         enrolledcourses = self.getenrolledcourses(coupleID)
  560.         self.Acourses = []
  561.         for course in allcourses:
  562.             if isin(course,enrolledcourses):
  563.                 pass
  564.             else:
  565.                 self.Acourses.append(course)
  566.         return self.Acourses
  567.  
  568.     def enroll(self,CouplesID,CoursesID):
  569.         '''will create a new enrollment record with the given CouplesID and CoursesID'''
  570.         self.curs.execute('insert into Enrollment values(?,?)',[CouplesID[0].get(),CoursesID])
  571.         self.conn.commit()
  572.  
  573.     def unenroll(self,CouplesID,CoursesID):
  574.         '''will delete a matching enrollment record with the given CouplesID and CoursesID'''
  575.         self.curs.execute('DELETE FROM Enrollment WHERE CouplesID = ? AND CoursesID = ?',[CouplesID[0].get(),CoursesID])
  576.         self.conn.commit()
  577.  
  578.  
  579.     def updatetext(self,textbox,var):
  580.         '''will update a given Strvar with the contents of a textbox'''
  581.         var[0].set(textbox.get("1.0","end"))
  582.  
  583.     def concatonatedate(self,day,month,year):
  584.         '''will concatonate the given strings and return them'''
  585.         date = str(day)+"/"+str(month)+"/"+str(year)
  586.         return date
  587.  
  588.     def errormessage(self,info):
  589.          messagebox.showinfo(message=info,icon="warning")
  590.  
  591.     def validates(self,values):
  592.         i = -1
  593.         correct = True
  594.         while correct and i < len(values)-1:
  595.             i +=1
  596.             correct = self.Validate(values[i])
  597.         if not correct:
  598.             self.errormessage("please enter"+values[i][1][1])
  599.             return False
  600.         else:
  601.              return True
  602.  
  603.     def Validate(self,value):
  604.         if value[1] == "":
  605.  
  606.             return True
  607.         else:
  608.             if value[1][0].match(value[0].get()):
  609.                 return True
  610.             else:
  611.                 value[0].set("")
  612.                 return False
  613.  
  614.     def logout(self):
  615.         global w
  616.         root.destroy()
  617.         w = None
  618.         vp_start_guilogin()
  619.  
  620.     def set_Tk_var(self):
  621.         '''will set up the self variables for the main window and specify what if any validation is required'''
  622.  
  623.         #----------------------------Validation
  624.         Vphonenumber = [re.compile('(\+\d\d|\d)\d\d\d\d ?\d\d\d ?\d\d\d$')," a valid phone number."]
  625.         Vpostcode = [re.compile('[a-zA-Z][a-zA-Z]?\d\d? ?\d[a-zA-Z][a-zA-Z]$')," a valid postcode"]
  626.         Vstring = [re.compile('[a-zA-Z]+$')," letters only."]
  627.         Vemail = [re.compile('[a-zA-Z0-9_\.]+@[a-zA-Z0-9_.]+\.[a-zA-Z]+')," a valid email address."]
  628.         Vdateday = [re.compile('([1-9]$|[1-2][1-9]$|31$)')," a day between 1 and 31"]
  629.         Vdatemonth = [re.compile('([1-9]$|1[1-2]$)')," a month between 1 and 12"]
  630.         Vdateyear = [re.compile('(20([0-4][0-9]|50))')," a year between 2000 and 2050"]
  631.         Vtime = [re.compile('\d\d\:\d\d')," a time in the format xx:xx"]
  632.  
  633.         self.searchV = StringVar()
  634.         self.searchF = StringVar()
  635.         self.searchV2 = StringVar()
  636.         self.searchF2 = StringVar()
  637.         self.coupleID = [StringVar(),""]
  638.         #------------------------------ address
  639.         self.address_line1 = [StringVar(),""]
  640.         self.address_line2 = [StringVar(),""]
  641.         self.address_town = [StringVar(),""]
  642.         self.address_county = [StringVar(),""]
  643.         self.address_postcode = [StringVar(),Vpostcode]
  644.         #----------------------------- woman details
  645.         self.Wemailaddress = [StringVar(),Vemail]
  646.         self.Wmobilenumber = [StringVar(),Vphonenumber]
  647.         self.Wsurname = [StringVar(),Vstring]
  648.         self.Wfirstname = [StringVar(),Vstring]
  649.         #----------------------------- partner details
  650.         self.Pemailaddress = [StringVar(),Vemail]
  651.         self.Pmobilenumber = [StringVar(),Vphonenumber]
  652.         self.Psurname = [StringVar(),Vstring]
  653.         self.Pfirstname = [StringVar(),Vstring]
  654.         self.notescouple = [StringVar(),""]
  655.         self.fieldlist = [self.coupleID,self.Wfirstname,self.Wsurname,self.Wmobilenumber,self.Wemailaddress,self.Pfirstname,self.Psurname,self.Pmobilenumber,self.Pemailaddress,self.address_line1,self.address_line2,self.address_town,self.address_county,self.address_postcode,self.notescouple]
  656.         #---------------------------- course details
  657.         self.courseID = [StringVar(),""]
  658.         self.coursetype = [StringVar(),""]
  659.         self.startdateday = [StringVar(),Vdateday]
  660.         self.enddateday = [StringVar(),Vdateday]
  661.         self.startdatemonth = [StringVar(),Vdatemonth]
  662.         self.startdateyear = [StringVar(),Vdateyear]
  663.         self.enddatemonth = [StringVar(),Vdatemonth]
  664.         self.enddateyear = [StringVar(),Vdateyear]
  665.         self.venuel1 = [StringVar(),""]
  666.         self.venuel2 = [StringVar(),""]
  667.         self.venuet = [StringVar(),""]
  668.         self.venuec = [StringVar(),""]
  669.         self.venuep = [StringVar(),Vpostcode]
  670.         self.notescourse = [StringVar(),""]
  671.         self.coursefieldlist = [self.courseID,self.coursetype,self.startdateday,self.enddateday,self.startdatemonth,self.enddatemonth,self.startdateyear,self.enddateyear,self.venuel1,self.venuel2,self.venuet,self.venuec,self.venuep,self.notescourse]
  672.         #---------------------------- Class details
  673.         self.ClassuniqueID = [StringVar(),""]
  674.         self.Classid = [StringVar(),""]
  675.         self.Classname = [StringVar(),""]
  676.         self.Classdateday = [StringVar(),Vdateday]
  677.         self.Classdatemonth = [StringVar(),Vdatemonth]
  678.         self.Classdateyear = [StringVar(),Vdateyear]
  679.         self.Classstarttime = [StringVar(),Vtime]
  680.         self.Classendtime = [StringVar(),Vtime]
  681.         self.Classnotes = [StringVar(),""]
  682.         self.Classesresults = []
  683.         self.Classfieldlist = [self.ClassuniqueID,self.courseID,self.Classid,self.Classname,self.Classdateday,self.Classdatemonth,self.Classdateyear,self.Classstarttime,self.Classendtime,self.Classnotes]
  684.         #--------------------------- Enrolment
  685.         self.EcourseID = [StringVar(),""]
  686.         self.EcoupleID = [StringVar(),""]
  687.         self.Acourses= []
  688.         self.ECourses= []
  689.  
  690. class Login: #login screen
  691.     '''class for the login/newuser window'''
  692.     def __init__(self, master=None):
  693.         style = ttk.Style()
  694.         theme = style.theme_use()
  695.         default = style.lookup(theme, 'background')
  696.         master.configure(background=default)
  697.         master.resizable(FALSE,FALSE)
  698.         self.topmenu = Menu(master,font=('MS Sans Serif',10,'normal','roman',))
  699.         master.configure(menu = self.topmenu)
  700.         self.username = StringVar()
  701.         self.password = StringVar()
  702.         self.usernameentry = xwidget('ttk::entry',master,0.31,0.07,0.14,0.5,takefocus="",cursor="ibeam",textvariable=self.username)
  703.         self.passwordentry = xwidget('ttk::entry',master,0.31,0.26,0.14,0.5,takefocus="",cursor="ibeam",show="*",textvariable=self.password)
  704.         self.usernamelabel = xwidget('ttk::label',master,0.08,0.07,relief="flat",text="Username")
  705.         self.passwordlabel = xwidget('ttk::label',master,0.08,0.26,relief="flat",text="Password")
  706.         self.loginbutton = xwidget('ttk::button',master,0.39,0.46,takefocus="",text="Login",command=lambda:self.login())
  707.         self.tBu40 = xwidget('ttk::button',master,0.04,0.79,takefocus="",text="Create new user",command=lambda:self.newlogin(self.username.get(),self.password.get()))
  708.  
  709.         master.bind('<Return>',lambda e: self.login())
  710.  
  711.     def newlogin(self,username,password):
  712.         database = ["CREATE TABLE [Classes] ([ClassID] INTEGER PRIMARY KEY AUTOINCREMENT,[CoursesID] INTEGER ,[ClassesID] INTEGER,[Classname] VARCHAR, [Classdateday] DATE, [Classdatemonth] DATE, [Classdateyear] DATE, [starttime] DATETIME, [endtime] DATETIME, [notes] VARCHAR);",
  713. "CREATE TABLE [Couples] ([CouplesID] INTEGER PRIMARY KEY AUTOINCREMENT, [Wfirstname] TEXT, [Wsurname] TEXT, [Wmobilenumber] INTEGER, [Wemailaddress] VARCHAR, [Mfirstname] TEXT, [Msurname] TEXT, [Mmobilenumber] INTEGER, [Memailaddress] VARCHAR, [Aline1] VARCHAR, [Aline2] VARCHAR, [Atown] TEXT, [Acounty] TEXT, [Apostcode] VARCHAR, [notes] VARCHAR);",
  714. "CREATE TABLE [Courses] ([CoursesID] INTEGER PRIMARY KEY AUTOINCREMENT,[coursetype] VARCHAR, [startdateday] DATE, [enddateday] DATE, [startdatemonth] DATE, [enddatemonth] DATE, [startdateyear] DATE, [enddateyear] DATE, [venuel1] TEXT, [venuel2] TEXT, [venuet] TEXT, [venuelc] TEXT, [venuep] TEXT, [notes] VARCHAR);",
  715. "CREATE TABLE [Enrollment] ([CouplesID] INTEGER, [CoursesID] INTEGER, PRIMARY KEY ([CouplesID] COLLATE 'NOCASE', [CoursesID] COLLATE 'NOCASE'));",
  716. "CREATE TABLE [settings] ([username] TEXT PRIMARY KEY, [pw] TEXT);"]
  717.         db = sqlite3.connect(username+"database.db")
  718.         cursor = db.cursor()
  719.         try:
  720.             for base in database:
  721.                 cursor.execute(base)
  722.             cursor.execute('insert into settings values(?,?)',(username,password))
  723.         except:
  724.             db.commit()
  725.     def login(self):
  726.         try:
  727.             databasename =self.username.get()+"database.db"
  728.             conn = sqlite3.connect(databasename)                  #conn is created and connected to the database
  729.             curs = conn.cursor()
  730.             curs.execute('select * from settings')
  731.             settings = curs.fetchall()
  732.             if (self.username.get() == settings[0][0] and self.password.get() == settings [0][1]):
  733.                 global w
  734.                 root.destroy()
  735.                 w = None
  736.                 vp_start_gui(databasename)
  737.             else: messagebox.showinfo(message='Incorrect password.',icon="warning")
  738.         except:
  739.             messagebox.showinfo(message='Incorrect username.',icon="warning")
  740.  
  741. class AutoScroll(object):
  742.     def __init__(self, master):
  743.         vsb = ttk.Scrollbar(master, orient='vertical', command=self.yview)
  744.         hsb = ttk.Scrollbar(master, orient='horizontal', command=self.xview)
  745.  
  746.         self.configure(yscrollcommand=self._autoscroll(vsb),
  747.             xscrollcommand=self._autoscroll(hsb))
  748.         self.grid(column=0, row=0, sticky='nsew')
  749.         vsb.grid(column=1, row=0, sticky='ns')
  750.         hsb.grid(column=0, row=1, sticky='ew')
  751.  
  752.         master.grid_columnconfigure(0, weight=1)
  753.         master.grid_rowconfigure(0, weight=1)
  754.         methods = Pack.__dict__.keys() + Grid.__dict__.keys() \
  755.                   + Place.__dict__.keys()
  756.  
  757.         for meth in methods:
  758.             if meth[0] != '_' and meth not in ('config', 'configure'):
  759.                 setattr(self, meth, getattr(master, meth))
  760.  
  761.     @staticmethod
  762.     def _autoscroll(sbar):
  763.         '''Hide and show scrollbar as needed.'''
  764.         def wrapped(first, last):
  765.             first, last = float(first), float(last)
  766.             if first <= 0 and last >= 1:
  767.                 sbar.grid_remove()
  768.             else:
  769.                 sbar.grid()
  770.             sbar.set(first, last)
  771.         return wrapped
  772.  
  773.     def __str__(self):
  774.         return str(self.master)
  775.  
  776. def _create_container(func):
  777.     '''Creates a ttk Frame with a given master, and use this new frame to
  778.    place the scrollbars and the widget.'''
  779.     def wrapped(cls, master, **kw):
  780.         container = ttk.Frame(master)
  781.         return func(cls, container, **kw)
  782.     return wrapped
  783.  
  784. class ScrolledText(AutoScroll, Text):
  785.     '''A standard Tkinter Text widget with scrollbars that will
  786.    automatically show/hide as needed.'''
  787.     @_create_container
  788.     def __init__(self, master, **kw):
  789.         Text.__init__(self, master, **kw)
  790.         AutoScroll.__init__(self, master)
  791. class ScrolledTreeView(AutoScroll, ttk.Treeview,):
  792.     '''A standard ttk Treeview widget with scrollbars that will
  793.    automatically show/hide as needed.'''
  794.     @_create_container
  795.     def __init__(self, master, **kw):
  796.         ttk.Treeview.__init__(self, master, **kw)
  797.         AutoScroll.__init__(self, master)
  798.  
  799. vp_start_guilogin()ssage='Incorrect password.',icon="warning")
  800.         except:
  801.             messagebox.showinfo(message='Incorrect username.',icon="warning")
  802.  
  803. class AutoScroll(object):
  804.     def __init__(self, master):
  805.         vsb = ttk.Scrollbar(master, orient='vertical', command=self.yview)
  806.         hsb = ttk.Scrollbar(master, orient='horizontal', command=self.xview)
  807.  
  808.         self.configure(yscrollcommand=self._autoscroll(vsb),
  809.             xscrollcommand=self._autoscroll(hsb))
  810.         self.grid(column=0, row=0, sticky='nsew')
  811.         vsb.grid(column=1, row=0, sticky='ns')
  812.         hsb.grid(column=0, row=1, sticky='ew')
  813.  
  814.         master.grid_columnconfigure(0, weight=1)
  815.         master.grid_rowconfigure(0, weight=1)
  816.         methods = Pack.__dict__.keys() + Grid.__dict__.keys() \
  817.                   + Place.__dict__.keys()
  818.  
  819.         for meth in methods:
  820.             if meth[0] != '_' and meth not in ('config', 'configure'):
  821.                 setattr(self, meth, getattr(master, meth))
  822.  
  823.     @staticmethod
  824.     def _autoscroll(sbar):
  825.         '''Hide and show scrollbar as needed.'''
  826.         def wrapped(first, last):
  827.             first, last = float(first), float(last)
  828.             if first <= 0 and last >= 1:
  829.                 sbar.grid_remove()
  830.             else:
  831.                 sbar.grid()
  832.             sbar.set(first, last)
  833.         return wrapped
  834.  
  835.     def __str__(self):
  836.         return str(self.master)
  837.  
  838. def _create_container(func):
  839.     '''Creates a ttk Frame with a given master, and use this new frame to
  840.    place the scrollbars and the widget.'''
  841.     def wrapped(cls, master, **kw):
  842.         container = ttk.Frame(master)
  843.         return func(cls, container, **kw)
  844.     return wrapped
  845.  
  846. class ScrolledText(AutoScroll, Text):
  847.     '''A standard Tkinter Text widget with scrollbars that will
  848.    automatically show/hide as needed.'''
  849.     @_create_container
  850.     def __init__(self, master, **kw):
  851.         Text.__init__(self, master, **kw)
  852.         AutoScroll.__init__(self, master)
  853. class ScrolledTreeView(AutoScroll, ttk.Treeview,):
  854.     '''A standard ttk Treeview widget with scrollbars that will
  855.    automatically show/hide as needed.'''
  856.     @_create_container
  857.     def __init__(self, master, **kw):
  858.         ttk.Treeview.__init__(self, master, **kw)
  859.         AutoScroll.__init__(self, master)
  860.  
  861.  
  862. vp_start_guilogin()eview.__init__(self, master, **kw)
  863.         AutoScroll.__init__(self, master)
  864.  
  865. vp_start_guilogin()
Add Comment
Please, Sign In to add comment