update,
This commit is contained in:
BIN
task2/Assignment.pdf
Normal file
BIN
task2/Assignment.pdf
Normal file
Binary file not shown.
195
task2/Assignment.py
Normal file
195
task2/Assignment.py
Normal file
@@ -0,0 +1,195 @@
|
||||
import tkinter
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
|
||||
class Applicant():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
#Set Personal Info Method
|
||||
|
||||
#Set HD Info Method
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
return True
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
def show(self): #Show Button method
|
||||
pass#remove it when you complete the codings
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
BIN
task2/_backup/draft0001-1/Assignment.pdf
Normal file
BIN
task2/_backup/draft0001-1/Assignment.pdf
Normal file
Binary file not shown.
202
task2/_backup/draft0001-1/src/Assignment.py
Normal file
202
task2/_backup/draft0001-1/src/Assignment.py
Normal file
@@ -0,0 +1,202 @@
|
||||
import tkinter
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
from tkinter import *
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
|
||||
class Applicant():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
#Set Personal Info Method
|
||||
|
||||
#Set HD Info Method
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Employee Name")
|
||||
lbl_name.grid(row=0, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=0, column=1, columnspan=2, sticky="nsew")
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
return True
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
def show(self): #Show Button method
|
||||
pass#remove it when you complete the codings
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
10
task2/_backup/draft0001-1/src/test.bat
Normal file
10
task2/_backup/draft0001-1/src/test.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python ./Assignment.py
|
||||
timeout /t 1
|
||||
goto loop
|
BIN
task2/_backup/draft0001/Assignment.pdf
Normal file
BIN
task2/_backup/draft0001/Assignment.pdf
Normal file
Binary file not shown.
195
task2/_backup/draft0001/src/Assignment.py
Normal file
195
task2/_backup/draft0001/src/Assignment.py
Normal file
@@ -0,0 +1,195 @@
|
||||
import tkinter
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
|
||||
class Applicant():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
#Set Personal Info Method
|
||||
|
||||
#Set HD Info Method
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
return True
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
def show(self): #Show Button method
|
||||
pass#remove it when you complete the codings
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
BIN
task2/_backup/draft0002/Assignment.pdf
Normal file
BIN
task2/_backup/draft0002/Assignment.pdf
Normal file
Binary file not shown.
286
task2/_backup/draft0002/src/Assignment.py
Normal file
286
task2/_backup/draft0002/src/Assignment.py
Normal file
@@ -0,0 +1,286 @@
|
||||
import tkinter
|
||||
import tkinter.ttk
|
||||
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
from tkinter import *
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
|
||||
class Applicant():
|
||||
pass#remove it when you complete the codings
|
||||
|
||||
#constructor __init__
|
||||
|
||||
# __str__ method
|
||||
|
||||
#Set Personal Info Method
|
||||
|
||||
#Set HD Info Method
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Name" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Email" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
|
||||
# ask genden with radio button, male or female
|
||||
lbl_gender = tkinter.Label(frm_content, text="Gender" , anchor="w", justify="left", width=20)
|
||||
lbl_gender.grid(row=row, column=0)
|
||||
rad_male = tkinter.Radiobutton(frm_content, text="Male")
|
||||
rad_male.grid(row=row, column=1)
|
||||
rad_female = tkinter.Radiobutton(frm_content, text="Female")
|
||||
rad_female.grid(row=row, column=2)
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Date of Birth" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Apply Programme" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
|
||||
# combobox for apply programme
|
||||
lst_programme=[]
|
||||
monthchoosen = tkinter.ttk.Combobox(frm_content, textvariable=lst_programme, values=lst_programme, )
|
||||
monthchoosen.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
|
||||
|
||||
row += 1
|
||||
|
||||
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
return True
|
||||
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Institution Name", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Programme Title", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="GPA", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Expected Graduation Year", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
ent_name = tkinter.Entry(frm_content)
|
||||
ent_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
return True
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
# textbox for summary
|
||||
txt_summary = tkinter.Text(frm_content, height=10)
|
||||
txt_summary.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(1,1), padx=(1,1))
|
||||
row += 1
|
||||
|
||||
|
||||
# right justify button with text "show"
|
||||
btn_show = tkinter.Button(frm_base, text="Show", anchor=tkinter.E)
|
||||
btn_show.pack(side=tkinter.RIGHT)
|
||||
|
||||
# btn_show = tkinter.Button(frm_content, text="Show", anchor=tkinter.E)
|
||||
# btn_show.grid(row=row, column=2, pady=(10,10), padx=(10,10))
|
||||
|
||||
|
||||
|
||||
###
|
||||
|
||||
def show(self): #Show Button method
|
||||
pass#remove it when you complete the codings
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
###
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
10
task2/_backup/draft0002/src/test.bat
Normal file
10
task2/_backup/draft0002/src/test.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python ./Assignment.py
|
||||
timeout /t 1
|
||||
goto loop
|
BIN
task2/_backup/draft0003/Assignment.pdf
Normal file
BIN
task2/_backup/draft0003/Assignment.pdf
Normal file
Binary file not shown.
369
task2/_backup/draft0003/src/Assignment.py
Normal file
369
task2/_backup/draft0003/src/Assignment.py
Normal file
@@ -0,0 +1,369 @@
|
||||
import tkinter
|
||||
import tkinter.ttk
|
||||
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
from tkinter import *
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
# Attributes:
|
||||
# institutionName– a non-public string to store the HD institution name of the applicant.
|
||||
# programmeTitle – a non-public string to store the HD programme name of the applicant.
|
||||
# gpa – a non-public double to store the HD GPA of the applicant.
|
||||
# expectedGradeYear– a non-public int to store the Expected HD Graduation Year of the applicant.
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in HDinfo object. It is a Parameterized constructor.
|
||||
# str – return a string containing the Attributes of HDinfo object. This method is used to display in Summary ScrolledText.
|
||||
|
||||
#constructor __init__
|
||||
def __init__(self, institutionName="",programmeTitle="", gpa="",expectedGraYear="" ):
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__():
|
||||
print("helloworld string method")
|
||||
pass
|
||||
|
||||
|
||||
class Applicant():
|
||||
# Attributes:
|
||||
# name – a non-public string to store the name of the applicant.
|
||||
# email – a non-public string to store the email of the applicant.
|
||||
# gender – a non-public string to store the gender of the applicant.
|
||||
# dateOfBirth – a non-public string to store the applicant date of birth.
|
||||
# applyDegreeProgramme – a non-public string to store the applicant selected
|
||||
# degree programme
|
||||
# hdInfo– a non-public HDinfo(self-defined class) to store the applicant Higher
|
||||
# Diploma information
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in Applicant object. It is a Parameterized constructor.
|
||||
# setPeronalInfo – setter method to set the name, email, gender, dateOfBirth, applyDegreeProgrmme into the Applicant object.
|
||||
# setHDinfo – setter method to set the HDinfo object into the Applicant object.
|
||||
# str – return a string containing the Attributes of this Applicant. This function is used to display in Summary ScrolledText.
|
||||
|
||||
#constructor __init__
|
||||
def __init__( self, name="", email="",gender="", dateOfBirth="",applyDegreeProgramme="",hdInfo = HDinfo() ):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
pass
|
||||
|
||||
# Set Personal Info Method
|
||||
def setPeronalInfo(self, name, email, gender,dateOfBirth, applyDegreeProgramme ):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
# Set HD Info Method
|
||||
def setHDInfo(self, hd):
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__(self):
|
||||
return "helloworld string method"
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Name" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_name = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_name.insert(0, "applicant name")
|
||||
self.ent_applicant_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Email" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_email = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_email.insert(0, "123@123.com")
|
||||
self.ent_applicant_email.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
# ask genden with radio button, male or female
|
||||
self.gender_select = tkinter.StringVar(value="Male")
|
||||
|
||||
lbl_gender = tkinter.Label(frm_content, text="Gender" , anchor="w", justify="left", width=20)
|
||||
lbl_gender.grid(row=row, column=0)
|
||||
|
||||
rad_male = tkinter.Radiobutton(frm_content, variable=self.gender_select,text="Male",value="Male")
|
||||
rad_male.grid(row=row, column=1)
|
||||
|
||||
rad_female = tkinter.Radiobutton(frm_content, variable=self.gender_select,text="Female",value="Female")
|
||||
rad_female.grid(row=row, column=2)
|
||||
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Date of Birth" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_DOB = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_DOB.insert(0, "14/02/2024")
|
||||
self.ent_applicant_DOB.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Apply Programme" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
|
||||
# combobox for apply programme
|
||||
lst_programme=["Bachelor of Science in Cybersecurity" , "Bachelor of Science in Computer Science and AI"]
|
||||
self.applicant_programme = tkinter.ttk.Combobox(frm_content, textvariable=lst_programme, values=lst_programme, )
|
||||
self.applicant_programme.current(0)
|
||||
self.applicant_programme.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_applicant_name.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_applicant_email.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_applicant_DOB.get() == "":
|
||||
entry_valid = False
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setPeronalInfo(
|
||||
self.ent_applicant_name.get(),
|
||||
self.ent_applicant_email.get(),
|
||||
self.gender_select.get(),
|
||||
self.ent_applicant_DOB.get(),
|
||||
self.applicant_programme.get()
|
||||
)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Institution Name", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_institution_name = tkinter.Entry(frm_content)
|
||||
self.ent_institution_name.insert(0, "TYIVE")
|
||||
self.ent_institution_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Programme Title", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_programme_title = tkinter.Entry(frm_content)
|
||||
self.ent_programme_title.insert(0, "HD")
|
||||
self.ent_programme_title.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="GPA", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_GPA = tkinter.Entry(frm_content)
|
||||
self.ent_GPA.insert(0, "1")
|
||||
self.ent_GPA.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Expected Graduation Year", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.expected_grad_year = tkinter.Entry(frm_content)
|
||||
self.expected_grad_year.insert(0, "2025")
|
||||
self.expected_grad_year.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_institution_name.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_programme_title.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_GPA.get() == "":
|
||||
entry_valid = False
|
||||
|
||||
hd = HDinfo(
|
||||
self.ent_institution_name.get(),
|
||||
self.ent_programme_title.get(),
|
||||
self.ent_GPA.get(),
|
||||
self.expected_grad_year.get()
|
||||
)
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setHDInfo(hd)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
# textbox for summary
|
||||
self.txt_summary = tkinter.Text(frm_content, height=10)
|
||||
self.txt_summary.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(1,1), padx=(1,1))
|
||||
row += 1
|
||||
|
||||
|
||||
# right justify button with text "show"
|
||||
btn_show = tkinter.Button(frm_base, text="Show", anchor=tkinter.E)
|
||||
btn_show.pack(side=tkinter.RIGHT)
|
||||
|
||||
# tkinter bind button click
|
||||
btn_show.bind("<Button-1>", self.show)
|
||||
|
||||
###
|
||||
|
||||
def show(self, _ ): #Show Button method
|
||||
###
|
||||
#Write your coding here
|
||||
self.txt_summary.insert(tkinter.INSERT, str(applicant))
|
||||
###
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
10
task2/_backup/draft0003/src/test.bat
Normal file
10
task2/_backup/draft0003/src/test.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python ./Assignment.py
|
||||
timeout /t 1
|
||||
goto loop
|
BIN
task2/_backup/draft0004/Assignment.pdf
Normal file
BIN
task2/_backup/draft0004/Assignment.pdf
Normal file
Binary file not shown.
379
task2/_backup/draft0004/src/Assignment.py
Normal file
379
task2/_backup/draft0004/src/Assignment.py
Normal file
@@ -0,0 +1,379 @@
|
||||
import tkinter
|
||||
import tkinter.ttk
|
||||
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
from tkinter import *
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
# Attributes:
|
||||
# institutionName– a non-public string to store the HD institution name of the applicant.
|
||||
# programmeTitle – a non-public string to store the HD programme name of the applicant.
|
||||
# gpa – a non-public double to store the HD GPA of the applicant.
|
||||
# expectedGradeYear– a non-public int to store the Expected HD Graduation Year of the applicant.
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in HDinfo object. It is a Parameterized constructor.
|
||||
# str – return a string containing the Attributes of HDinfo object. This method is used to display in Summary ScrolledText.
|
||||
|
||||
#constructor __init__
|
||||
def __init__(self, institutionName="",programmeTitle="", gpa="",expectedGraYear="" ):
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__():
|
||||
print("helloworld string method")
|
||||
pass
|
||||
|
||||
|
||||
class Applicant():
|
||||
# Attributes:
|
||||
# name – a non-public string to store the name of the applicant.
|
||||
# email – a non-public string to store the email of the applicant.
|
||||
# gender – a non-public string to store the gender of the applicant.
|
||||
# dateOfBirth – a non-public string to store the applicant date of birth.
|
||||
# applyDegreeProgramme – a non-public string to store the applicant selected
|
||||
# degree programme
|
||||
# hdInfo– a non-public HDinfo(self-defined class) to store the applicant Higher
|
||||
# Diploma information
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in Applicant object. It is a Parameterized constructor.
|
||||
# setPeronalInfo – setter method to set the name, email, gender, dateOfBirth, applyDegreeProgrmme into the Applicant object.
|
||||
# setHDinfo – setter method to set the HDinfo object into the Applicant object.
|
||||
# str – return a string containing the Attributes of this Applicant. This function is used to display in Summary ScrolledText.
|
||||
|
||||
#constructor __init__
|
||||
def __init__( self, name="", email="",gender="", dateOfBirth="",applyDegreeProgramme="",hdInfo = HDinfo() ):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
pass
|
||||
|
||||
# Set Personal Info Method
|
||||
def setPeronalInfo(self, name, email, gender,dateOfBirth, applyDegreeProgramme ):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
# Set HD Info Method
|
||||
def setHDInfo(self, hd):
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__(self):
|
||||
return """
|
||||
Applicant Name: Ben
|
||||
Applicant Email: ben@vtc.edu.hk
|
||||
Gender: Male
|
||||
Date of Birth: 2004/03/13
|
||||
Apply Degree Programme: Bachelor of Science in Computer Science and AI
|
||||
Higher Diploma Information:
|
||||
Institution Name: IVE(Chai Wan)
|
||||
Programme Title: HD in AI and Smart Technology
|
||||
GPA: 3.8
|
||||
Expected Graduation Year: 2025
|
||||
""".strip()
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Name" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_name = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_name.insert(0, "Ben")
|
||||
self.ent_applicant_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Email" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_email = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_email.insert(0, "ben@vtc.edu.hk")
|
||||
self.ent_applicant_email.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
# ask genden with radio button, male or female
|
||||
self.gender_select = tkinter.StringVar(value="Male")
|
||||
|
||||
lbl_gender = tkinter.Label(frm_content, text="Gender" , anchor="w", justify="left", width=20)
|
||||
lbl_gender.grid(row=row, column=0)
|
||||
|
||||
rad_male = tkinter.Radiobutton(frm_content, variable=self.gender_select,text="Male",value="Male")
|
||||
rad_male.grid(row=row, column=1)
|
||||
|
||||
rad_female = tkinter.Radiobutton(frm_content, variable=self.gender_select,text="Female",value="Female")
|
||||
rad_female.grid(row=row, column=2)
|
||||
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Date of Birth" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_DOB = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_DOB.insert(0, "2004/03/13")
|
||||
self.ent_applicant_DOB.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Apply Programme" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
|
||||
# combobox for apply programme
|
||||
lst_programme=["Bachelor of Science in Cybersecurity" , "Bachelor of Science in Computer Science and AI"]
|
||||
self.applicant_programme = tkinter.ttk.Combobox(frm_content, textvariable=lst_programme, values=lst_programme, )
|
||||
self.applicant_programme.current(0)
|
||||
self.applicant_programme.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_applicant_name.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_applicant_email.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_applicant_DOB.get() == "":
|
||||
entry_valid = False
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setPeronalInfo(
|
||||
self.ent_applicant_name.get(),
|
||||
self.ent_applicant_email.get(),
|
||||
self.gender_select.get(),
|
||||
self.ent_applicant_DOB.get(),
|
||||
self.applicant_programme.get()
|
||||
)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Institution Name", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_institution_name = tkinter.Entry(frm_content)
|
||||
self.ent_institution_name.insert(0, "IVE(Chai Wan)")
|
||||
self.ent_institution_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Programme Title", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_programme_title = tkinter.Entry(frm_content)
|
||||
self.ent_programme_title.insert(0, "HD in AI and Smart Technology")
|
||||
self.ent_programme_title.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="GPA", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_GPA = tkinter.Entry(frm_content)
|
||||
self.ent_GPA.insert(0, "3.8")
|
||||
self.ent_GPA.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Expected Graduation Year", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.expected_grad_year = tkinter.Entry(frm_content)
|
||||
self.expected_grad_year.insert(0, "2025")
|
||||
self.expected_grad_year.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_institution_name.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_programme_title.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_GPA.get() == "":
|
||||
entry_valid = False
|
||||
|
||||
hd = HDinfo(
|
||||
self.ent_institution_name.get(),
|
||||
self.ent_programme_title.get(),
|
||||
self.ent_GPA.get(),
|
||||
self.expected_grad_year.get()
|
||||
)
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setHDInfo(hd)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
# textbox for summary
|
||||
self.txt_summary = tkinter.Text(frm_content, height=12)
|
||||
self.txt_summary.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(1,1), padx=(1,1))
|
||||
row += 1
|
||||
|
||||
# right justify button with text "show"
|
||||
btn_show = tkinter.Button(frm_base, text="Show", anchor=tkinter.E)
|
||||
btn_show.pack(side=tkinter.RIGHT)
|
||||
|
||||
# tkinter bind button click
|
||||
btn_show.bind("<Button-1>", self.show)
|
||||
|
||||
###
|
||||
|
||||
def show(self, _ ): #Show Button method
|
||||
###
|
||||
#Write your coding here
|
||||
self.txt_summary.insert(tkinter.INSERT, str(applicant))
|
||||
###
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
10
task2/_backup/draft0004/src/test.bat
Normal file
10
task2/_backup/draft0004/src/test.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python ./Assignment.py
|
||||
timeout /t 1
|
||||
goto loop
|
BIN
task2/_backup/draft0005/Assignment.pdf
Normal file
BIN
task2/_backup/draft0005/Assignment.pdf
Normal file
Binary file not shown.
395
task2/_backup/draft0005/src/Assignment.py
Normal file
395
task2/_backup/draft0005/src/Assignment.py
Normal file
@@ -0,0 +1,395 @@
|
||||
import tkinter
|
||||
import tkinter.ttk
|
||||
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
from tkinter import *
|
||||
|
||||
###class starts
|
||||
class HDinfo():
|
||||
# Attributes:
|
||||
# institutionName– a non-public string to store the HD institution name of the applicant.
|
||||
# programmeTitle – a non-public string to store the HD programme name of the applicant.
|
||||
# gpa – a non-public double to store the HD GPA of the applicant.
|
||||
# expectedGradeYear– a non-public int to store the Expected HD Graduation Year of the applicant.
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in HDinfo object. It is a Parameterized constructor.
|
||||
# str – return a string containing the Attributes of HDinfo object. This method is used to display in Summary ScrolledText.
|
||||
|
||||
#constructor __init__
|
||||
def __init__(self, institutionName="",programmeTitle="", gpa="",expectedGraYear="" ):
|
||||
self.institutionName = institutionName
|
||||
self.programmeTitle = programmeTitle
|
||||
self.gpa = gpa
|
||||
self.expectedGraYear = expectedGraYear
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__(self):
|
||||
return """
|
||||
Higher Diploma Information:
|
||||
Institution Name: {hd_institution_name}
|
||||
Programme Title: {hd_programme_title}
|
||||
GPA: {hd_gpa}
|
||||
Expected Graduation Year: {expectedGraYear}
|
||||
""".strip().format(
|
||||
hd_institution_name=self.institutionName,
|
||||
hd_programme_title=self.programmeTitle,
|
||||
hd_gpa=self.gpa,
|
||||
expectedGraYear=self.expectedGraYear,
|
||||
)
|
||||
|
||||
|
||||
class Applicant():
|
||||
# Attributes:
|
||||
# name – a non-public string to store the name of the applicant.
|
||||
# email – a non-public string to store the email of the applicant.
|
||||
# gender – a non-public string to store the gender of the applicant.
|
||||
# dateOfBirth – a non-public string to store the applicant date of birth.
|
||||
# applyDegreeProgramme – a non-public string to store the applicant selected
|
||||
# degree programme
|
||||
# hdInfo– a non-public HDinfo(self-defined class) to store the applicant Higher
|
||||
# Diploma information
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in Applicant object. It is a Parameterized constructor.
|
||||
# setPeronalInfo – setter method to set the name, email, gender, dateOfBirth, applyDegreeProgrmme into the Applicant object.
|
||||
# setHDinfo – setter method to set the HDinfo object into the Applicant object.
|
||||
# str – return a string containing the Attributes of this Applicant. This function is used to display in Summary ScrolledText.
|
||||
|
||||
#constructor __init__
|
||||
def __init__( self, name="", email="",gender="", dateOfBirth="",applyDegreeProgramme="",hdInfo = HDinfo() ):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
pass
|
||||
|
||||
# Set Personal Info Method
|
||||
def setPeronalInfo(self, name, email, gender,dateOfBirth, applyDegreeProgramme ):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
# Set HD Info Method
|
||||
def setHDInfo(self, hd):
|
||||
self.hd = hd
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__(self):
|
||||
return """
|
||||
Applicant Name: {applicant_name}
|
||||
Applicant Email: {applicant_email}
|
||||
Gender: {gender}
|
||||
Date of Birth: {DOB}
|
||||
Apply Degree Programme: {applyDegreeProgramme}
|
||||
""".strip().format(
|
||||
applicant_name=self.name,
|
||||
applicant_email=self.email,
|
||||
gender=self.gender,
|
||||
DOB=self.dateOfBirth,
|
||||
applyDegreeProgramme=self.applyDegreeProgramme,
|
||||
) +'\n'+ self.hd.__str__()
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
###class ends
|
||||
|
||||
|
||||
###Tkinter starts
|
||||
|
||||
|
||||
#Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Name" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_name = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_name.insert(0, "Ben")
|
||||
self.ent_applicant_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Applicant Email" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_email = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_email.insert(0, "ben@vtc.edu.hk")
|
||||
self.ent_applicant_email.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
# ask genden with radio button, male or female
|
||||
self.gender_select = tkinter.StringVar(value="Male")
|
||||
|
||||
lbl_gender = tkinter.Label(frm_content, text="Gender" , anchor="w", justify="left", width=20)
|
||||
lbl_gender.grid(row=row, column=0)
|
||||
|
||||
rad_male = tkinter.Radiobutton(frm_content, variable=self.gender_select,text="Male",value="Male")
|
||||
rad_male.grid(row=row, column=1)
|
||||
|
||||
rad_female = tkinter.Radiobutton(frm_content, variable=self.gender_select,text="Female",value="Female")
|
||||
rad_female.grid(row=row, column=2)
|
||||
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Date of Birth" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_applicant_DOB = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_DOB.insert(0, "2004/03/13")
|
||||
self.ent_applicant_DOB.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Apply Programme" , anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
|
||||
# combobox for apply programme
|
||||
lst_programme=["Bachelor of Science in Cybersecurity" , "Bachelor of Science in Computer Science and AI"]
|
||||
self.applicant_programme = tkinter.ttk.Combobox(frm_content, textvariable=lst_programme, values=lst_programme, )
|
||||
self.applicant_programme.current(0)
|
||||
self.applicant_programme.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
|
||||
|
||||
###
|
||||
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_applicant_name.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_applicant_email.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_applicant_DOB.get() == "":
|
||||
entry_valid = False
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setPeronalInfo(
|
||||
self.ent_applicant_name.get(),
|
||||
self.ent_applicant_email.get(),
|
||||
self.gender_select.get(),
|
||||
self.ent_applicant_DOB.get(),
|
||||
self.applicant_programme.get()
|
||||
)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Institution Name", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_institution_name = tkinter.Entry(frm_content)
|
||||
self.ent_institution_name.insert(0, "IVE(Chai Wan)")
|
||||
self.ent_institution_name.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Programme Title", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_programme_title = tkinter.Entry(frm_content)
|
||||
self.ent_programme_title.insert(0, "HD in AI and Smart Technology")
|
||||
self.ent_programme_title.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="GPA", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_GPA = tkinter.Entry(frm_content)
|
||||
self.ent_GPA.insert(0, "3.8")
|
||||
self.ent_GPA.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
|
||||
lbl_name = tkinter.Label(frm_content, text="Expected Graduation Year", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.expected_grad_year = tkinter.Entry(frm_content)
|
||||
self.expected_grad_year.insert(0, "2025")
|
||||
self.expected_grad_year.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(10,10), padx=(10,10))
|
||||
row += 1
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
#Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_institution_name.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_programme_title.get() == "":
|
||||
entry_valid = False
|
||||
if self.ent_GPA.get() == "":
|
||||
entry_valid = False
|
||||
|
||||
hd = HDinfo(
|
||||
self.ent_institution_name.get(),
|
||||
self.ent_programme_title.get(),
|
||||
self.ent_GPA.get(),
|
||||
self.expected_grad_year.get()
|
||||
)
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setHDInfo(hd)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
#Summary Output
|
||||
###
|
||||
#Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2,weight=1)
|
||||
|
||||
# textbox for summary
|
||||
self.txt_summary = tkinter.Text(frm_content, height=12)
|
||||
self.txt_summary.grid(row=row, column=1, columnspan=2, sticky="nsew", pady=(1,1), padx=(1,1))
|
||||
row += 1
|
||||
|
||||
# right justify button with text "show"
|
||||
btn_show = tkinter.Button(frm_base, text="Show", anchor=tkinter.E)
|
||||
btn_show.pack(side=tkinter.RIGHT)
|
||||
|
||||
# tkinter bind button click
|
||||
btn_show.bind("<Button-1>", self.show)
|
||||
|
||||
###
|
||||
|
||||
def show(self, _ ): #Show Button method
|
||||
###
|
||||
#Write your coding here
|
||||
self.txt_summary.insert(tkinter.INSERT, str(applicant))
|
||||
###
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
###Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
10
task2/_backup/draft0005/src/test.bat
Normal file
10
task2/_backup/draft0005/src/test.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python ./Assignment.py
|
||||
timeout /t 1
|
||||
goto loop
|
135
task2/_poc/Switch Between Different Page Frames/test.py
Normal file
135
task2/_poc/Switch Between Different Page Frames/test.py
Normal file
@@ -0,0 +1,135 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
|
||||
LARGEFONT =("Verdana", 35)
|
||||
|
||||
class tkinterApp(tk.Tk):
|
||||
|
||||
# __init__ function for class tkinterApp
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
||||
# __init__ function for class Tk
|
||||
tk.Tk.__init__(self, *args, **kwargs)
|
||||
|
||||
# creating a container
|
||||
container = tk.Frame(self)
|
||||
container.pack(side = "top", fill = "both", expand = True)
|
||||
|
||||
container.grid_rowconfigure(0, weight = 1)
|
||||
container.grid_columnconfigure(0, weight = 1)
|
||||
|
||||
# initializing frames to an empty array
|
||||
self.frames = {}
|
||||
|
||||
# iterating through a tuple consisting
|
||||
# of the different page layouts
|
||||
for F in (StartPage, Page1, Page2):
|
||||
|
||||
frame = F(container, self)
|
||||
|
||||
# initializing frame of that object from
|
||||
# startpage, page1, page2 respectively with
|
||||
# for loop
|
||||
self.frames[F] = frame
|
||||
|
||||
frame.grid(row = 0, column = 0, sticky ="nsew")
|
||||
|
||||
self.show_frame(StartPage)
|
||||
|
||||
# to display the current frame passed as
|
||||
# parameter
|
||||
def show_frame(self, cont):
|
||||
frame = self.frames[cont]
|
||||
frame.tkraise()
|
||||
|
||||
# first window frame startpage
|
||||
|
||||
class StartPage(tk.Frame):
|
||||
def __init__(self, parent, controller):
|
||||
tk.Frame.__init__(self, parent)
|
||||
|
||||
# label of frame Layout 2
|
||||
label = ttk.Label(self, text ="Startpage", font = LARGEFONT)
|
||||
|
||||
# putting the grid in its place by using
|
||||
# grid
|
||||
label.grid(row = 0, column = 4, padx = 10, pady = 10)
|
||||
|
||||
button1 = ttk.Button(self, text ="Page 1",
|
||||
command = lambda : controller.show_frame(Page1))
|
||||
|
||||
# putting the button in its place by
|
||||
# using grid
|
||||
button1.grid(row = 1, column = 1, padx = 10, pady = 10)
|
||||
|
||||
## button to show frame 2 with text layout2
|
||||
button2 = ttk.Button(self, text ="Page 2",
|
||||
command = lambda : controller.show_frame(Page2))
|
||||
|
||||
# putting the button in its place by
|
||||
# using grid
|
||||
button2.grid(row = 2, column = 1, padx = 10, pady = 10)
|
||||
|
||||
|
||||
|
||||
|
||||
# second window frame page1
|
||||
class Page1(tk.Frame):
|
||||
|
||||
def __init__(self, parent, controller):
|
||||
|
||||
tk.Frame.__init__(self, parent)
|
||||
label = ttk.Label(self, text ="Page 1", font = LARGEFONT)
|
||||
label.grid(row = 0, column = 4, padx = 10, pady = 10)
|
||||
|
||||
# button to show frame 2 with text
|
||||
# layout2
|
||||
button1 = ttk.Button(self, text ="StartPage",
|
||||
command = lambda : controller.show_frame(StartPage))
|
||||
|
||||
# putting the button in its place
|
||||
# by using grid
|
||||
button1.grid(row = 1, column = 1, padx = 10, pady = 10)
|
||||
|
||||
# button to show frame 2 with text
|
||||
# layout2
|
||||
button2 = ttk.Button(self, text ="Page 2",
|
||||
command = lambda : controller.show_frame(Page2))
|
||||
|
||||
# putting the button in its place by
|
||||
# using grid
|
||||
button2.grid(row = 2, column = 1, padx = 10, pady = 10)
|
||||
|
||||
|
||||
|
||||
|
||||
# third window frame page2
|
||||
class Page2(tk.Frame):
|
||||
def __init__(self, parent, controller):
|
||||
tk.Frame.__init__(self, parent)
|
||||
label = ttk.Label(self, text ="Page 2", font = LARGEFONT)
|
||||
label.grid(row = 0, column = 4, padx = 10, pady = 10)
|
||||
|
||||
# button to show frame 2 with text
|
||||
# layout2
|
||||
button1 = ttk.Button(self, text ="Page 1",
|
||||
command = lambda : controller.show_frame(Page1))
|
||||
|
||||
# putting the button in its place by
|
||||
# using grid
|
||||
button1.grid(row = 1, column = 1, padx = 10, pady = 10)
|
||||
|
||||
# button to show frame 3 with text
|
||||
# layout3
|
||||
button2 = ttk.Button(self, text ="Startpage",
|
||||
command = lambda : controller.show_frame(StartPage))
|
||||
|
||||
# putting the button in its place by
|
||||
# using grid
|
||||
button2.grid(row = 2, column = 1, padx = 10, pady = 10)
|
||||
|
||||
|
||||
# Driver Code
|
||||
app = tkinterApp()
|
||||
app.mainloop()
|
9
task2/_poc/grid/looptest.bat
Normal file
9
task2/_poc/grid/looptest.bat
Normal file
@@ -0,0 +1,9 @@
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python test.py
|
||||
timeout /t 1
|
||||
goto loop
|
32
task2/_poc/grid/test.py
Normal file
32
task2/_poc/grid/test.py
Normal file
@@ -0,0 +1,32 @@
|
||||
from tkinter import *
|
||||
from tkinter import ttk
|
||||
|
||||
root = Tk()
|
||||
|
||||
content = ttk.Frame(root)
|
||||
frame = ttk.Frame(content, borderwidth=5, relief="ridge", width=200, height=100)
|
||||
namelbl = ttk.Label(content, text="Name")
|
||||
name = ttk.Entry(content)
|
||||
|
||||
onevar = BooleanVar(value=True)
|
||||
twovar = BooleanVar(value=False)
|
||||
threevar = BooleanVar(value=True)
|
||||
|
||||
one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
|
||||
two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
|
||||
three = ttk.Checkbutton(content, text="Three", variable=threevar, onvalue=True)
|
||||
ok = ttk.Button(content, text="Okay")
|
||||
cancel = ttk.Button(content, text="Cancel")
|
||||
|
||||
content.grid(column=0, row=0)
|
||||
frame.grid(column=0, row=0, columnspan=3, rowspan=2)
|
||||
namelbl.grid(column=3, row=0, columnspan=2)
|
||||
|
||||
name.grid(column=3, row=1, columnspan=2)
|
||||
one.grid(column=0, row=3)
|
||||
two.grid(column=1, row=3)
|
||||
three.grid(column=2, row=3)
|
||||
ok.grid(column=3, row=3)
|
||||
cancel.grid(column=4, row=3)
|
||||
|
||||
root.mainloop()
|
1
task2/backup.bat
Normal file
1
task2/backup.bat
Normal file
@@ -0,0 +1 @@
|
||||
node ./backup.js
|
59
task2/backup.js
Normal file
59
task2/backup.js
Normal file
@@ -0,0 +1,59 @@
|
||||
const execSync = require('child_process').execSync
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
|
||||
// Function to get all subdirectories of a given directory
|
||||
function getDirectories(srcPath, excludeDirs) {
|
||||
return fs
|
||||
.readdirSync(srcPath)
|
||||
.filter(file => !excludeDirs.includes(file) && fs.lstatSync(path.join(srcPath, file)).isDirectory())
|
||||
.map(name => path.join(srcPath, name))
|
||||
}
|
||||
|
||||
// Get current working directory
|
||||
const cwd = process.cwd()
|
||||
|
||||
// Path to app-head directory
|
||||
const appHeadDir = path.join(cwd, 'project')
|
||||
|
||||
// Check if app-head exists
|
||||
if (!fs.existsSync(appHeadDir)) {
|
||||
console.error(`Error: ${appHeadDir} does not exist.`)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// Execute reset.bat scripts
|
||||
try {
|
||||
// execSync(`cmd /c "cd ${appHeadDir} && scripts\\reset.bat"`, { stdio: 'inherit' });
|
||||
} catch (err) {
|
||||
console.error(`Error executing reset.bat script: ${err.message}`)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
// Define excluded directories
|
||||
const excludedDirs = ['.next', 'node_modules', '.git', 'volumes']
|
||||
|
||||
// Copy app-head directory and its contents to a new directory with an increasing number suffix
|
||||
let maxNum = 0
|
||||
const directories = getDirectories(cwd, excludedDirs)
|
||||
for (const dir of directories) {
|
||||
const match = dir.match(/^.+draft(\d+)$/)
|
||||
if (match) {
|
||||
const num = parseInt(match[1], 10)
|
||||
if (num > maxNum) {
|
||||
maxNum = num
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var zerofilled = ('0000' + (maxNum + 1)).slice(-4)
|
||||
const targetDir = path.join(cwd, `draft${zerofilled}`)
|
||||
fs.mkdirSync(targetDir)
|
||||
|
||||
// Copy app-head directory and its contents to targetDir, excluding specified directories
|
||||
fs.cpSync(appHeadDir, targetDir, {
|
||||
filter: src => !excludedDirs.includes(path.basename(src)),
|
||||
recursive: true
|
||||
})
|
||||
|
||||
console.log(`Successfully copied ${appHeadDir} to ${targetDir}.`)
|
10
task2/digest.md
Normal file
10
task2/digest.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# Assignment
|
||||
|
||||
## Objective
|
||||
|
||||
This assignment is to implement the IT University Application System using Object Oriented Programming Techniques. Your coding must be able to show concepts such as Abstraction,Encapsulation, Inheritance and Polymorphism. Your program must be able to do the following:
|
||||
|
||||
1. Add applicant personal information, selected degree programme, higher diploma information.
|
||||
2. Preview the records.
|
||||
|
||||
## Requirements of the Assignment
|
26
task2/meta.md
Normal file
26
task2/meta.md
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
tags: [python, tkinter, ITP4459, windows, docker]
|
||||
---
|
||||
|
||||
# task2
|
||||
|
||||
## Balance history
|
||||
|
||||
### quotation
|
||||
|
||||
- HKD1600
|
||||
|
||||
### payment history
|
||||
|
||||
HKD 300 deposit paid
|
||||
|
||||
## NOTES
|
||||
|
||||
## Objective
|
||||
|
||||
This assignment is to implement the IT University Application System using Object Oriented Programming Techniques. Your coding must be able to show concepts such as Abstraction,Encapsulation, Inheritance and Polymorphism. Your program must be able to do the following:
|
||||
|
||||
1. Add applicant personal information, selected degree programme, higher diploma information.
|
||||
2. Preview the records.
|
||||
|
||||
## Requirements of the Assignment
|
BIN
task2/notes/4459_ass.docx
Normal file
BIN
task2/notes/4459_ass.docx
Normal file
Binary file not shown.
BIN
task2/notes/Lab_01a - Object and Class_Answers.docx
Normal file
BIN
task2/notes/Lab_01a - Object and Class_Answers.docx
Normal file
Binary file not shown.
BIN
task2/notes/Lab_01b - Object and Class_Answers.docx
Normal file
BIN
task2/notes/Lab_01b - Object and Class_Answers.docx
Normal file
Binary file not shown.
BIN
task2/notes/Lab_02a - Initializer_Answers.doc
Normal file
BIN
task2/notes/Lab_02a - Initializer_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_02b - Initializer_Answers.doc
Normal file
BIN
task2/notes/Lab_02b - Initializer_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_03a - Instance and Static Members_Answers.doc
Normal file
BIN
task2/notes/Lab_03a - Instance and Static Members_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_03b - Instance and Static Members_Answers.doc
Normal file
BIN
task2/notes/Lab_03b - Instance and Static Members_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_04a - Inheritance_Answers.doc
Normal file
BIN
task2/notes/Lab_04a - Inheritance_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_04b - Inheritance_Answers.doc
Normal file
BIN
task2/notes/Lab_04b - Inheritance_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_05a - Abstract Class_Answers (1).doc
Normal file
BIN
task2/notes/Lab_05a - Abstract Class_Answers (1).doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_05b - Abstract Class.doc
Normal file
BIN
task2/notes/Lab_05b - Abstract Class.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_06a - Database Connection_Answers (1).doc
Normal file
BIN
task2/notes/Lab_06a - Database Connection_Answers (1).doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_06b - Database Connection_Answers.doc
Normal file
BIN
task2/notes/Lab_06b - Database Connection_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_07a - Tkinter_Answers.doc
Normal file
BIN
task2/notes/Lab_07a - Tkinter_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_07b - Tkinter_Answers.doc
Normal file
BIN
task2/notes/Lab_07b - Tkinter_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_07c - Tkinter_Answers.doc
Normal file
BIN
task2/notes/Lab_07c - Tkinter_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_08a - Web Scraping_Answers.doc
Normal file
BIN
task2/notes/Lab_08a - Web Scraping_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_08b - Web Scraping_Answers.doc
Normal file
BIN
task2/notes/Lab_08b - Web Scraping_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_09a - Python Web Framework_Answers.doc
Normal file
BIN
task2/notes/Lab_09a - Python Web Framework_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_09b - Python Web Framework_Answers.doc
Normal file
BIN
task2/notes/Lab_09b - Python Web Framework_Answers.doc
Normal file
Binary file not shown.
BIN
task2/notes/Lab_09c - Python Web Framework_Answers.doc
Normal file
BIN
task2/notes/Lab_09c - Python Web Framework_Answers.doc
Normal file
Binary file not shown.
13
task2/package.json
Normal file
13
task2/package.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "hdhdjshxh",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"gitUpdate": "git add . && git commit -m\"update hdhdjshxh, task2,\" && git push"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
BIN
task2/project/Assignment.pdf
Normal file
BIN
task2/project/Assignment.pdf
Normal file
Binary file not shown.
BIN
task2/project/doc/HD_information_window.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/HD_information_window.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/Personal_info_window.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/Personal_info_window.png
(Stored with Git LFS)
Normal file
Binary file not shown.
12
task2/project/doc/Pipfile
Normal file
12
task2/project/doc/Pipfile
Normal file
@@ -0,0 +1,12 @@
|
||||
[[source]]
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
markdown2docx = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
[requires]
|
||||
python_version = "3.12"
|
312
task2/project/doc/Pipfile.lock
generated
Normal file
312
task2/project/doc/Pipfile.lock
generated
Normal file
@@ -0,0 +1,312 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "ce7bc21caf64cf9ad732d9869c89e2cf568c1b1d036c73753a58b09450611617"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
"python_version": "3.12"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
"url": "https://pypi.org/simple",
|
||||
"verify_ssl": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"default": {
|
||||
"beautifulsoup4": {
|
||||
"hashes": [
|
||||
"sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051",
|
||||
"sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
|
||||
],
|
||||
"markers": "python_full_version >= '3.6.0'",
|
||||
"version": "==4.12.3"
|
||||
},
|
||||
"bs4": {
|
||||
"hashes": [
|
||||
"sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925",
|
||||
"sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"
|
||||
],
|
||||
"version": "==0.0.2"
|
||||
},
|
||||
"lxml": {
|
||||
"hashes": [
|
||||
"sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04",
|
||||
"sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0",
|
||||
"sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739",
|
||||
"sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a",
|
||||
"sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1",
|
||||
"sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218",
|
||||
"sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9",
|
||||
"sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188",
|
||||
"sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138",
|
||||
"sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585",
|
||||
"sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637",
|
||||
"sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe",
|
||||
"sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d",
|
||||
"sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1",
|
||||
"sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095",
|
||||
"sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9",
|
||||
"sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81",
|
||||
"sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57",
|
||||
"sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536",
|
||||
"sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a",
|
||||
"sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052",
|
||||
"sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01",
|
||||
"sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98",
|
||||
"sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433",
|
||||
"sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1",
|
||||
"sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f",
|
||||
"sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4",
|
||||
"sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b",
|
||||
"sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6",
|
||||
"sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8",
|
||||
"sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5",
|
||||
"sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306",
|
||||
"sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5",
|
||||
"sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f",
|
||||
"sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4",
|
||||
"sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be",
|
||||
"sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919",
|
||||
"sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af",
|
||||
"sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66",
|
||||
"sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1",
|
||||
"sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af",
|
||||
"sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec",
|
||||
"sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b",
|
||||
"sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289",
|
||||
"sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a",
|
||||
"sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d",
|
||||
"sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102",
|
||||
"sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9",
|
||||
"sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc",
|
||||
"sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45",
|
||||
"sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa",
|
||||
"sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a",
|
||||
"sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c",
|
||||
"sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461",
|
||||
"sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708",
|
||||
"sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca",
|
||||
"sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd",
|
||||
"sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913",
|
||||
"sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da",
|
||||
"sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0",
|
||||
"sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5",
|
||||
"sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5",
|
||||
"sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96",
|
||||
"sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41",
|
||||
"sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3",
|
||||
"sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456",
|
||||
"sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c",
|
||||
"sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867",
|
||||
"sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0",
|
||||
"sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213",
|
||||
"sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619",
|
||||
"sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240",
|
||||
"sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c",
|
||||
"sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377",
|
||||
"sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b",
|
||||
"sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c",
|
||||
"sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54",
|
||||
"sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b",
|
||||
"sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53",
|
||||
"sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029",
|
||||
"sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6",
|
||||
"sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885",
|
||||
"sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94",
|
||||
"sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134",
|
||||
"sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8",
|
||||
"sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9",
|
||||
"sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863",
|
||||
"sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b",
|
||||
"sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806",
|
||||
"sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11",
|
||||
"sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9",
|
||||
"sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817",
|
||||
"sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95",
|
||||
"sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8",
|
||||
"sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc",
|
||||
"sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47",
|
||||
"sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b",
|
||||
"sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0",
|
||||
"sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a",
|
||||
"sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f",
|
||||
"sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56",
|
||||
"sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef",
|
||||
"sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851",
|
||||
"sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7",
|
||||
"sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62",
|
||||
"sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4",
|
||||
"sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a",
|
||||
"sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c",
|
||||
"sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533",
|
||||
"sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f",
|
||||
"sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e",
|
||||
"sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a",
|
||||
"sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3",
|
||||
"sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b",
|
||||
"sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4",
|
||||
"sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0",
|
||||
"sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d",
|
||||
"sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3",
|
||||
"sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5",
|
||||
"sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534",
|
||||
"sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4",
|
||||
"sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144",
|
||||
"sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd",
|
||||
"sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd",
|
||||
"sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860",
|
||||
"sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704",
|
||||
"sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8",
|
||||
"sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d",
|
||||
"sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9",
|
||||
"sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f",
|
||||
"sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad",
|
||||
"sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc",
|
||||
"sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510",
|
||||
"sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937",
|
||||
"sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a",
|
||||
"sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460",
|
||||
"sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85",
|
||||
"sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86",
|
||||
"sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0",
|
||||
"sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246",
|
||||
"sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7",
|
||||
"sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa",
|
||||
"sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08",
|
||||
"sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270",
|
||||
"sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a",
|
||||
"sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169",
|
||||
"sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e",
|
||||
"sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75",
|
||||
"sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd",
|
||||
"sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354",
|
||||
"sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c",
|
||||
"sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1",
|
||||
"sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb",
|
||||
"sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f",
|
||||
"sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==5.2.1"
|
||||
},
|
||||
"markdown2": {
|
||||
"hashes": [
|
||||
"sha256:18ceb56590da77f2c22382e55be48c15b3c8f0c71d6398def387275e6c347a9f",
|
||||
"sha256:855bde5cbcceb9beda7c80efdf7f406c23e6079172c497fcfce22fdce998e892"
|
||||
],
|
||||
"markers": "python_version >= '3.5' and python_version < '4'",
|
||||
"version": "==2.4.13"
|
||||
},
|
||||
"markdown2docx": {
|
||||
"hashes": [
|
||||
"sha256:026504ec82b59b9de2641366157fe11d5f3c4781b28cf6422460126dbbec7472",
|
||||
"sha256:a3a54f75be046e662630c7f2eb570d45cc98ada9892f17e84583db24c10a7510"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==0.1.0"
|
||||
},
|
||||
"pillow": {
|
||||
"hashes": [
|
||||
"sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c",
|
||||
"sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2",
|
||||
"sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb",
|
||||
"sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d",
|
||||
"sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa",
|
||||
"sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3",
|
||||
"sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1",
|
||||
"sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a",
|
||||
"sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd",
|
||||
"sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8",
|
||||
"sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999",
|
||||
"sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599",
|
||||
"sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936",
|
||||
"sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375",
|
||||
"sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d",
|
||||
"sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b",
|
||||
"sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60",
|
||||
"sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572",
|
||||
"sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3",
|
||||
"sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced",
|
||||
"sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f",
|
||||
"sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b",
|
||||
"sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19",
|
||||
"sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f",
|
||||
"sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d",
|
||||
"sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383",
|
||||
"sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795",
|
||||
"sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355",
|
||||
"sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57",
|
||||
"sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09",
|
||||
"sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b",
|
||||
"sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462",
|
||||
"sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf",
|
||||
"sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f",
|
||||
"sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a",
|
||||
"sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad",
|
||||
"sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9",
|
||||
"sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d",
|
||||
"sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45",
|
||||
"sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994",
|
||||
"sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d",
|
||||
"sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338",
|
||||
"sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463",
|
||||
"sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451",
|
||||
"sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591",
|
||||
"sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c",
|
||||
"sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd",
|
||||
"sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32",
|
||||
"sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9",
|
||||
"sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf",
|
||||
"sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5",
|
||||
"sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828",
|
||||
"sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3",
|
||||
"sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5",
|
||||
"sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2",
|
||||
"sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b",
|
||||
"sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2",
|
||||
"sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475",
|
||||
"sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3",
|
||||
"sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb",
|
||||
"sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef",
|
||||
"sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015",
|
||||
"sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002",
|
||||
"sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170",
|
||||
"sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84",
|
||||
"sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57",
|
||||
"sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f",
|
||||
"sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27",
|
||||
"sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"
|
||||
],
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==10.3.0"
|
||||
},
|
||||
"python-docx": {
|
||||
"hashes": [
|
||||
"sha256:5829b722141cf1ab79aedf0c34d9fe9924b29764584c0f2164eb2b02dcdf17c9",
|
||||
"sha256:bac9773278098a1ddc43a52d84e22f5909c4a3080a624530b3ecb3771b07c6cd"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==1.1.0"
|
||||
},
|
||||
"soupsieve": {
|
||||
"hashes": [
|
||||
"sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690",
|
||||
"sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"
|
||||
],
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==2.5"
|
||||
},
|
||||
"typing-extensions": {
|
||||
"hashes": [
|
||||
"sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0",
|
||||
"sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"
|
||||
],
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==4.11.0"
|
||||
}
|
||||
},
|
||||
"develop": {}
|
||||
}
|
1
task2/project/doc/conv.bat
Normal file
1
task2/project/doc/conv.bat
Normal file
@@ -0,0 +1 @@
|
||||
python ./to_docx.py
|
BIN
task2/project/doc/result_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_10.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_10.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_10_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_10_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_11.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_11.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_11_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_11_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_12.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_12.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_12_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_12_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_13.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_13.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_13_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_13_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_13_2.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_13_2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_14.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_14.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_14_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_14_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_14_2.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_14_2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_1_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_1_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_2.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_2_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_2_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_3.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_3.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_3_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_3_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_4.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_4.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_4_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_4_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_5.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_5.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_5_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_5_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_6.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_6.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_6_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_6_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_7.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_7.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_7_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_7_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_8_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_8_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_8_2.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_8_2.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_8_3.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_8_3.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_8_4.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_8_4.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_9.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_9.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/result_9_1.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/result_9_1.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/summary_window.png
(Stored with Git LFS)
Normal file
BIN
task2/project/doc/summary_window.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
task2/project/doc/test - Copy.docx
Normal file
BIN
task2/project/doc/test - Copy.docx
Normal file
Binary file not shown.
24
task2/project/doc/test copy.md
Normal file
24
task2/project/doc/test copy.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# TEST plan
|
||||
|
||||
### Gui
|
||||
|
||||
1. Validation on the input data and display appropriate error messages
|
||||
|
||||
1. Test Plan with test cases and test results.
|
||||
|
||||
| ID | Test Case Name | Procedure | Expected Output | Result | screen capture |
|
||||
| --- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 1 | Missing "Applicant Name" | 1. leave "applicant name" field empty.<br />1. Click "Next" button | The error MessageBox appears "name cannot empty."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 2 | Missing "Applicant Email" | 1. leave "applicant email" field empty.<br />1. Click "Next" button | The error MessageBox appears "email field cannot empty."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 3 | Missing "Date of Birth" | 1. leave "date of birth" field empty. <br />1. Click "Next" button | The error MessageBox appears "dob field cannot empty."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 4 | Missing Institution Name | 1. leave "Institution Name" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 5 | Missing Programme Title | 1. leave "Programme Title" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 6 | Missing GPA | 1. leave "GPA" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 7 | Missing Expected Graduation Year | 1. leave "Expected Graduation Year" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 8 | Showing summary if all input field fullfilled | 1. filling all required information in "Personal Information" <br />1. clici "Next" button <br /> 1. Filling all required information in"Higher Diploma Information" windows. <br />1. Click "Next" button<br /> 1. click "show" button to show summary | finally the summary window showing information in the page inputted before | Pass/Fail |  <br /><br /><br /> |
|
||||
| 9 | Date of birth should be in the past | 1. enter a day after today to the "date of birth" field <br /> 1. click next button | The error MessageBox appears "DOB: the day entered is latter than today."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail |  <br /> |
|
||||
| 10 | email entered should be valid | 1. enter an invalid email e.g. "ankitrai326.com" <br /> 1. click "next" button | The error MessageBox appears "email format error, it should be email."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | <br /> |
|
||||
| 11 | GPA should be a number / decimal | 1. enter a non numeric value into "GPA" field <br />1. Click "Next" button | The error MessageBox appears "GPA field should be a number."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | <br /> |
|
||||
| 12 | Expected graduation year should be in future | 1. enter a day in the past in "Graduation year" field <br />1. Click "Next" button | The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | <br /> |
|
||||
| 13 | female appliciant | 1. select female in applicant gender field <br />1. Click "Next" button | The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | <br /><br /> |
|
||||
| 14 | "Bachelor of Science in Computer Science and AI" in apply programme | 1. select female in applicant gender field <br />1. Click "Next" button | The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | <br /><br /> |
|
15
task2/project/doc/test.csv
Normal file
15
task2/project/doc/test.csv
Normal file
@@ -0,0 +1,15 @@
|
||||
ID , Test Case Name , Procedure , Expected Output , Result , screen capture ,
|
||||
1," Missing ""Applicant Name"" "," 1. leave ""applicant name"" field empty.<br />1. Click ""Next"" button "," The error MessageBox appears ""name cannot empty.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
2," Missing ""Applicant Email"" "," 1. leave ""applicant email"" field empty.<br />1. Click ""Next"" button "," The error MessageBox appears ""email field cannot empty.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
3," Missing ""Date of Birth"" "," 1. leave ""date of birth"" field empty. <br />1. Click ""Next"" button "," The error MessageBox appears ""dob field cannot empty.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
4, Missing Institution Name ," 1. leave ""Institution Name"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
5, Missing Programme Title ," 1. leave ""Programme Title"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
6, Missing GPA ," 1. leave ""GPA"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
7, Missing Expected Graduation Year ," 1. leave ""Expected Graduation Year"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
8, Showing summary if all input field fullfilled ," 1. filling all required information in ""Personal Information"" <br />1. clici ""Next"" button <br /> 1. Filling all required information in""Higher Diploma Information"" windows. <br />1. Click ""Next"" button<br /> 1. click ""show"" button to show summary ", finally the summary window showing information in the page inputted before , Pass/Fail ,  <br /><br /><br />,
|
||||
9, Date of birth should be in the past ," 1. enter a day after today to the ""date of birth"" field <br /> 1. click next button "," The error MessageBox appears ""DOB: the day entered is latter than today.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail ,  <br /> ,
|
||||
10, email entered should be valid ," 1. enter an invalid email e.g. ""ankitrai326.com"" <br /> 1. click ""next"" button "," The error MessageBox appears ""email format error"," it should be email.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , <br />
|
||||
11, GPA should be a number / decimal ," 1. enter a non numeric value into ""GPA"" field <br />1. Click ""Next"" button "," The error MessageBox appears ""GPA field should be a number.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , <br /> ,
|
||||
12, Expected graduation year should be in future ," 1. enter a day in the past in ""Graduation year"" field <br />1. Click ""Next"" button "," The error MessageBox appears ""Expected graduation year should be after current year.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , <br /> ,
|
||||
13, female appliciant ," 1. select female in applicant gender field <br />1. Click ""Next"" button "," The error MessageBox appears ""Expected graduation year should be after current year.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , <br /><br /> ,
|
||||
14," ""Bachelor of Science in Computer Science and AI"" in apply programme "," 1. select female in applicant gender field <br />1. Click ""Next"" button "," The error MessageBox appears ""Expected graduation year should be after current year.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , <br /><br />,
|
|
BIN
task2/project/doc/test.docx
Normal file
BIN
task2/project/doc/test.docx
Normal file
Binary file not shown.
285
task2/project/doc/test.md
Normal file
285
task2/project/doc/test.md
Normal file
@@ -0,0 +1,285 @@
|
||||
# TEST plan
|
||||
|
||||
### Test purpose
|
||||
|
||||
1. Validation on the input data and display appropriate error messages
|
||||
|
||||
1. Test Plan with test cases and test results.
|
||||
|
||||
### Test #1
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Test Case Name | Missing "Applicant Name" |
|
||||
| Procedure | 1. leave "applicant name" field empty.\n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "name cannot empty."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #2
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Missing "Applicant Email" |
|
||||
| Procedure | 1. leave "applicant email" field empty.\n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "email field cannot empty."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #3
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Missing "Date of Birth" |
|
||||
| Procedure | 1. leave "date of birth" field empty. \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "dob field cannot empty."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #4
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Missing Institution Name |
|
||||
| Procedure | 1. leave "Institution Name" field empty \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #5
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Missing Programme Title |
|
||||
| Procedure | 1. leave "Programme Title" field empty \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #6
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Missing GPA |
|
||||
| Procedure | 1. leave "GPA" field empty \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #7
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Missing Expected Graduation Year |
|
||||
| Procedure | 1. leave "Expected Graduation Year" field empty \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #8
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | Showing summary if all input field fullfilled |
|
||||
| Procedure | 1. filling all required information in "Personal Information" \n1. clici "Next" button \n 1. Filling all required information in"Higher Diploma Information" windows. \n1. Click "Next" button\n 1. click "show" button to show summary |
|
||||
| Expected Output | finally the summary window showing information in the page inputted before |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 3 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 4 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #9
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Test Case Name | Date of birth should be in the past |
|
||||
| Procedure | 1. enter a day after today to the "date of birth" field \n 1. click next button |
|
||||
| Expected Output | The error MessageBox appears "DOB: the day entered is latter than today."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #10
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | email entered should be valid |
|
||||
| Procedure | 1. enter an invalid email e.g. "ankitrai326.com" \n 1. click "next" button |
|
||||
| Expected Output | The error MessageBox appears "email format error |
|
||||
| Result | it should be email."\nThe error MessageBox appears "Please enter all required information." |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||
Pass/Fail
|
||||
|
||||
### Test #11
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Test Case Name | GPA should be a number / decimal |
|
||||
| Procedure | 1. enter a non numeric value into "GPA" field \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "GPA field should be a number."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #12
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Test Case Name | Expected graduation year should be in future |
|
||||
| Procedure | 1. enter a day in the past in "Graduation year" field \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Expected graduation year should be after current year."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #13
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Test Case Name | female appliciant |
|
||||
| Procedure | 1. select female in applicant gender field \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Expected graduation year should be after current year."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 3 screenshot
|
||||
|
||||

|
||||
|
||||
### Test #14
|
||||
|
||||
| del me | del me |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| Test Case Name | "Bachelor of Science in Computer Science and AI" in apply programme |
|
||||
| Procedure | 1. select female in applicant gender field \n1. Click "Next" button |
|
||||
| Expected Output | The error MessageBox appears "Expected graduation year should be after current year."\nThe error MessageBox appears "Please enter all required information." |
|
||||
| Result | Pass/Fail |
|
||||
|
||||
### Screen capture
|
||||
|
||||
#### step 1 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 2 screenshot
|
||||
|
||||

|
||||
|
||||
#### step 3 screenshot
|
||||
|
||||

|
6
task2/project/doc/to_docx.py
Normal file
6
task2/project/doc/to_docx.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from Markdown2docx import Markdown2docx
|
||||
|
||||
print("writing Q9950_GetDocx")
|
||||
project = Markdown2docx('test')
|
||||
project.eat_soup()
|
||||
project.save()
|
38
task2/project/doc/transpose.py
Normal file
38
task2/project/doc/transpose.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import csv
|
||||
|
||||
|
||||
|
||||
print('''# TEST plan
|
||||
|
||||
### Test purpose
|
||||
|
||||
1. Validation on the input data and display appropriate error messages
|
||||
|
||||
1. Test Plan with test cases and test results.''')
|
||||
print('\n')
|
||||
print('\n')
|
||||
print('\n')
|
||||
|
||||
# read a csv file named test.csv
|
||||
with open('test.csv', 'r') as f:
|
||||
|
||||
# creating a csv reader object
|
||||
csvreader = csv.reader(f)
|
||||
|
||||
# extracting each data row one by one
|
||||
for row in csvreader:
|
||||
|
||||
print(f'### Test #{row[0]}')
|
||||
print('\n')
|
||||
print(f'| del me | del me |')
|
||||
print(f'| ----- | ----- |')
|
||||
print(f'| Test Case Name | {row[1]} |')
|
||||
print(f'| Procedure | {row[2].replace("<br />",'\\n')} |')
|
||||
print(f'| Expected Output | {row[3].replace("<br />",'\\n')} |')
|
||||
print(f'| Result | {row[4].replace("<br />",'\\n')} |')
|
||||
print('\n')
|
||||
print("### Screen capture")
|
||||
print( '\n'.join([ (f'\n#### step {i+1} screenshot\n'+x.strip()) for i, x in enumerate(row[5].split("<br />"))]) )
|
||||
print('\n')
|
||||
print('\n')
|
||||
|
508
task2/project/src/Assignment.py
Normal file
508
task2/project/src/Assignment.py
Normal file
@@ -0,0 +1,508 @@
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import datetime
|
||||
|
||||
import tkinter
|
||||
import tkinter.ttk
|
||||
|
||||
import tkinter.messagebox
|
||||
import tkinter.scrolledtext
|
||||
from tkinter import *
|
||||
|
||||
# class starts
|
||||
|
||||
|
||||
class HDinfo():
|
||||
# Attributes:
|
||||
# institutionName– a non-public string to store the HD institution name of the applicant.
|
||||
# programmeTitle – a non-public string to store the HD programme name of the applicant.
|
||||
# gpa – a non-public double to store the HD GPA of the applicant.
|
||||
# expectedGradeYear– a non-public int to store the Expected HD Graduation Year of the applicant.
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in HDinfo object. It is a Parameterized constructor.
|
||||
# str – return a string containing the Attributes of HDinfo object. This method is used to display in Summary ScrolledText.
|
||||
|
||||
# constructor __init__
|
||||
def __init__(self, institutionName="", programmeTitle="", gpa="", expectedGraYear=""):
|
||||
self.institutionName = institutionName
|
||||
self.programmeTitle = programmeTitle
|
||||
self.gpa = gpa
|
||||
self.expectedGraYear = expectedGraYear
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__(self):
|
||||
return """
|
||||
Higher Diploma Information:
|
||||
Institution Name: {hd_institution_name}
|
||||
Programme Title: {hd_programme_title}
|
||||
GPA: {hd_gpa}
|
||||
Expected Graduation Year: {expectedGraYear}
|
||||
""".strip().format(
|
||||
hd_institution_name=self.institutionName,
|
||||
hd_programme_title=self.programmeTitle,
|
||||
hd_gpa=self.gpa,
|
||||
expectedGraYear=self.expectedGraYear,
|
||||
)
|
||||
|
||||
|
||||
class Applicant():
|
||||
# Attributes:
|
||||
# name – a non-public string to store the name of the applicant.
|
||||
# email – a non-public string to store the email of the applicant.
|
||||
# gender – a non-public string to store the gender of the applicant.
|
||||
# dateOfBirth – a non-public string to store the applicant date of birth.
|
||||
# applyDegreeProgramme – a non-public string to store the applicant selected
|
||||
# degree programme
|
||||
# hdInfo– a non-public HDinfo(self-defined class) to store the applicant Higher
|
||||
# Diploma information
|
||||
|
||||
# Methods:
|
||||
# init – initialize all attributes in Applicant object. It is a Parameterized constructor.
|
||||
# setPeronalInfo – setter method to set the name, email, gender, dateOfBirth, applyDegreeProgrmme into the Applicant object.
|
||||
# setHDinfo – setter method to set the HDinfo object into the Applicant object.
|
||||
# str – return a string containing the Attributes of this Applicant. This function is used to display in Summary ScrolledText.
|
||||
|
||||
# constructor __init__
|
||||
def __init__(self, name="", email="", gender="", dateOfBirth="", applyDegreeProgramme="", hdInfo=HDinfo()):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
pass
|
||||
|
||||
# Set Personal Info Method
|
||||
def setPeronalInfo(self, name, email, gender, dateOfBirth, applyDegreeProgramme):
|
||||
self.name = name
|
||||
self.email = email
|
||||
self.gender = gender
|
||||
self.dateOfBirth = dateOfBirth
|
||||
self.applyDegreeProgramme = applyDegreeProgramme
|
||||
|
||||
# Set HD Info Method
|
||||
def setHDInfo(self, hd):
|
||||
self.hd = hd
|
||||
pass
|
||||
|
||||
# __str__ method
|
||||
def __str__(self):
|
||||
"""
|
||||
Returns a string representation of the Applicant object.
|
||||
|
||||
Returns:
|
||||
str: A formatted string containing the applicant's name, email, gender, date of birth, and applied degree programme.
|
||||
Also includes a string representation of the Higher Diploma object.
|
||||
"""
|
||||
return """
|
||||
Applicant Name: {applicant_name}
|
||||
Applicant Email: {applicant_email}
|
||||
Gender: {gender}
|
||||
Date of Birth: {DOB}
|
||||
Apply Degree Programme: {applyDegreeProgramme}
|
||||
""".strip().format(
|
||||
applicant_name=self.name,
|
||||
applicant_email=self.email,
|
||||
gender=self.gender,
|
||||
DOB=self.dateOfBirth,
|
||||
applyDegreeProgramme=self.applyDegreeProgramme,
|
||||
) + '\n' + self.hd.__str__()
|
||||
|
||||
|
||||
applicant = Applicant()
|
||||
# class ends
|
||||
|
||||
|
||||
# Tkinter starts
|
||||
|
||||
|
||||
# Parent class for Personal and HighDiploma
|
||||
class ApplicationPage(tkinter.Frame):
|
||||
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
def is_complete(self) -> bool:
|
||||
"""Check if the current page is complete."""
|
||||
return True
|
||||
|
||||
|
||||
class Personal(ApplicationPage):
|
||||
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(
|
||||
frm_title, text="Personal Infromation", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
# Write your coding here
|
||||
# Frame for the content
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.grid_columnconfigure(2, weight=1)
|
||||
|
||||
# Row counter, to advance row in screen
|
||||
row = 0
|
||||
|
||||
# Label for applicant name
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Applicant Name", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
# Entry box for applicant name
|
||||
self.ent_applicant_name = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_name.insert(0, "")
|
||||
self.ent_applicant_name.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
# Label for applicant email
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Applicant Email", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
# Entry box for applicant email
|
||||
self.ent_applicant_email = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_email.insert(0, "")
|
||||
self.ent_applicant_email.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
# String variable to store the selected gender
|
||||
self.gender_select = tkinter.StringVar(value="Male")
|
||||
|
||||
# Label for gender
|
||||
lbl_gender = tkinter.Label(
|
||||
frm_content, text="Gender", anchor="w", justify="left", width=20)
|
||||
lbl_gender.grid(row=row, column=0)
|
||||
|
||||
# Radio buttons for gender selection
|
||||
rad_male = tkinter.Radiobutton(
|
||||
frm_content, variable=self.gender_select, text="Male", value="Male")
|
||||
rad_male.grid(row=row, column=1)
|
||||
|
||||
rad_female = tkinter.Radiobutton(
|
||||
frm_content, variable=self.gender_select, text="Female", value="Female")
|
||||
rad_female.grid(row=row, column=2)
|
||||
|
||||
row += 1
|
||||
|
||||
# Label for date of birth
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Date of Birth", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
|
||||
# Entry box for date of birth
|
||||
self.ent_applicant_DOB = tkinter.Entry(frm_content)
|
||||
self.ent_applicant_DOB.insert(0, "")
|
||||
self.ent_applicant_DOB.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
# Label for apply programme
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Apply Programme", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
|
||||
# List of programme options and combobox for apply programme
|
||||
lst_programme = ["Bachelor of Science in Cybersecurity",
|
||||
"Bachelor of Science in Computer Science and AI"]
|
||||
self.applicant_programme = tkinter.ttk.Combobox(
|
||||
frm_content, textvariable=lst_programme, values=lst_programme, state="readonly",)
|
||||
self.applicant_programme.current(0)
|
||||
self.applicant_programme.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
def is_complete(self):
|
||||
|
||||
###
|
||||
# Write your coding here
|
||||
entry_valid = True
|
||||
if self.ent_applicant_name.get() == "":
|
||||
tkinter.messagebox.showinfo("Information", "name cannot empty.")
|
||||
entry_valid = False
|
||||
|
||||
if self.ent_applicant_email.get() == "":
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "email field cannot empty.")
|
||||
entry_valid = False
|
||||
else:
|
||||
# check if email field valid
|
||||
# https://www.geeksforgeeks.org/check-if-email-address-valid-or-not-in-python/
|
||||
if not re.match(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b', self.ent_applicant_email.get()):
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "email: format error, it should be email.")
|
||||
entry_valid = False
|
||||
|
||||
if self.ent_applicant_DOB.get() == "":
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "dob field cannot empty.")
|
||||
entry_valid = False
|
||||
else:
|
||||
# python re to check if yyyy/mm/dd
|
||||
if not re.match(r'^\d{4}/\d{2}/\d{2}$', self.ent_applicant_DOB.get()):
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "DOB format error, it should be yyyy/mm/dd.")
|
||||
entry_valid = False
|
||||
|
||||
# ptyhon to check if the day entered is latter than today
|
||||
today = datetime.date.today()
|
||||
if datetime.datetime.strptime(self.ent_applicant_DOB.get(), '%Y/%m/%d').date() > today:
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "DOB the day enter is latter than today.")
|
||||
entry_valid = False
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setPeronalInfo(
|
||||
self.ent_applicant_name.get(),
|
||||
self.ent_applicant_email.get(),
|
||||
self.gender_select.get(),
|
||||
self.ent_applicant_DOB.get(),
|
||||
self.applicant_programme.get()
|
||||
)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class HighDiploma(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(
|
||||
frm_title, text="Higher Diploma Information", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
###
|
||||
# Write your coding here
|
||||
# Content frame for the form entries
|
||||
row = 0 # row counter for the form
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2, weight=1)
|
||||
|
||||
# Label and entry for Institution name
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Institution Name", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_institution_name = tkinter.Entry(frm_content)
|
||||
self.ent_institution_name.insert(0, "")
|
||||
self.ent_institution_name.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
# Label and entry for Programme Title
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Programme Title", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_programme_title = tkinter.Entry(frm_content)
|
||||
self.ent_programme_title.insert(0, "")
|
||||
self.ent_programme_title.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
# Label and entry for GPA
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="GPA", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.ent_GPA = tkinter.Entry(frm_content)
|
||||
self.ent_GPA.insert(0, "")
|
||||
self.ent_GPA.grid(row=row, column=1, columnspan=2,
|
||||
sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
# Label and entry for Expected Graduation Year
|
||||
lbl_name = tkinter.Label(
|
||||
frm_content, text="Expected Graduation Year", anchor="w", justify="left", width=20)
|
||||
lbl_name.grid(row=row, column=0)
|
||||
self.expected_grad_year = tkinter.Entry(frm_content)
|
||||
self.expected_grad_year.insert(0, "")
|
||||
self.expected_grad_year.grid(
|
||||
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
|
||||
row += 1
|
||||
|
||||
###
|
||||
|
||||
def is_complete(self):
|
||||
###
|
||||
# Write your coding here
|
||||
|
||||
entry_valid = True
|
||||
if self.ent_institution_name.get() == "":
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "institution name field cannot empty.")
|
||||
entry_valid = False
|
||||
if self.ent_programme_title.get() == "":
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "programme title field cannot empty.")
|
||||
entry_valid = False
|
||||
|
||||
if self.ent_GPA.get() == "":
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "GPA field cannot empty.")
|
||||
entry_valid = False
|
||||
else:
|
||||
|
||||
# check if gpa field is a number
|
||||
try:
|
||||
float(self.ent_GPA.get())
|
||||
except ValueError:
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "GPA field should be a number.")
|
||||
entry_valid = False
|
||||
|
||||
if self.expected_grad_year.get() == "":
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Expected graduation year field cannot empty.")
|
||||
entry_valid = False
|
||||
else:
|
||||
|
||||
# check if gpa field is a number
|
||||
try:
|
||||
int(self.expected_grad_year.get())
|
||||
|
||||
# check if expected grad year is after current year
|
||||
today = datetime.date.today()
|
||||
if int(self.expected_grad_year.get()) < today.year:
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Expected graduation year should be after current year.")
|
||||
entry_valid = False
|
||||
|
||||
except ValueError:
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Expected graduation year field should be a number.")
|
||||
entry_valid = False
|
||||
|
||||
hd = HDinfo(
|
||||
self.ent_institution_name.get(),
|
||||
self.ent_programme_title.get(),
|
||||
self.ent_GPA.get(),
|
||||
self.expected_grad_year.get()
|
||||
)
|
||||
|
||||
if (entry_valid):
|
||||
applicant.setHDInfo(hd)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class Result(ApplicationPage):
|
||||
def __init__(self, master):
|
||||
super().__init__(master)
|
||||
|
||||
frm_base = tkinter.Frame(self)
|
||||
frm_base.pack(fill=tkinter.BOTH, expand=True)
|
||||
|
||||
frm_title = tkinter.Frame(frm_base)
|
||||
frm_title.pack(fill=tkinter.BOTH)
|
||||
|
||||
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
|
||||
lbl_title.pack(anchor=tkinter.W)
|
||||
|
||||
# Summary Output
|
||||
###
|
||||
# Write your coding here
|
||||
row = 0
|
||||
frm_content = tkinter.Frame(frm_base)
|
||||
frm_content.pack(fill=tkinter.BOTH)
|
||||
frm_content.grid_columnconfigure(2, weight=1)
|
||||
|
||||
# textbox for summary
|
||||
self.txt_summary = tkinter.Text(frm_content, height=12)
|
||||
self.txt_summary.grid(row=row, column=1, columnspan=2,
|
||||
sticky="nsew", pady=(1, 1), padx=(1, 1))
|
||||
row += 1
|
||||
|
||||
# right justify button with text "show"
|
||||
btn_show = tkinter.Button(frm_base, text="Show", anchor=tkinter.E)
|
||||
btn_show.pack(side=tkinter.RIGHT)
|
||||
|
||||
# tkinter bind button click
|
||||
btn_show.bind("<Button-1>", self.show)
|
||||
|
||||
###
|
||||
|
||||
def show(self, _): # Show Button method
|
||||
###
|
||||
# Write your coding here
|
||||
self.txt_summary.insert(tkinter.INSERT, str(applicant))
|
||||
###
|
||||
|
||||
|
||||
class Application(tkinter.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Configure GUI
|
||||
self.title("Undergraduate Application Form")
|
||||
self.geometry("450x300")
|
||||
|
||||
# Content Frame
|
||||
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
|
||||
frm_content.pack(fill=tkinter.BOTH, expand=True)
|
||||
frm_content.rowconfigure(0, weight=1)
|
||||
frm_content.columnconfigure(0, weight=1)
|
||||
|
||||
# Application Pages
|
||||
self.__frames: list[ApplicationPage] = [
|
||||
Personal(frm_content),
|
||||
HighDiploma(frm_content),
|
||||
Result(frm_content),
|
||||
]
|
||||
for i in self.__frames:
|
||||
i.grid(row=0, column=0, sticky=tkinter.NSEW)
|
||||
self.__current_page = 0
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# Bottom Frame
|
||||
frm_button = tkinter.Frame(self, padx=4, pady=4)
|
||||
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
|
||||
|
||||
# Next Button
|
||||
self.btn_next = tkinter.Button(
|
||||
frm_button, text="Next", command=self.next_page)
|
||||
self.btn_next.pack(side=tkinter.RIGHT)
|
||||
|
||||
# Quit Button
|
||||
self.btn_quit = tkinter.Button(
|
||||
frm_button, text="Quit", command=self.destroy)
|
||||
|
||||
def next_page(self):
|
||||
# Check if the current page is complete
|
||||
if not self.__frames[self.__current_page].is_complete():
|
||||
tkinter.messagebox.showinfo(
|
||||
"Information", "Please fill the missing fields."
|
||||
)
|
||||
return
|
||||
|
||||
# Navigate to next page
|
||||
self.__current_page += 1
|
||||
self.__frames[self.__current_page].tkraise()
|
||||
|
||||
# If we reached the last page, replace the next button with quit button
|
||||
if self.__current_page + 1 == len(self.__frames):
|
||||
self.btn_next.pack_forget()
|
||||
self.btn_quit.pack(side=tkinter.RIGHT)
|
||||
# Tkinter ends
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = Application()
|
||||
app.mainloop()
|
10
task2/project/src/test.bat
Normal file
10
task2/project/src/test.bat
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
@REM rm *.bas
|
||||
@REM rm *.frm
|
||||
@REM rm *.frx
|
||||
@REM timeout 1
|
||||
|
||||
:loop
|
||||
python ./Assignment.py
|
||||
timeout /t 1
|
||||
goto loop
|
BIN
task2/project/test_report.docx
Normal file
BIN
task2/project/test_report.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user