Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter
- import tkinter.ttk as ttk
- import tkinter.filedialog
- import math
- class Statement:
- def __init__(self, id, surname, amount, averageMark):
- self.id = id
- self.surname = surname
- self.amount = amount
- self.averageMark = averageMark
- def setId(self, id):
- self.id = id
- def getId(self):
- return self.id
- def setSurname(self, surname):
- self.surname = surname
- def getSurname(self):
- return self.surname
- def setAmount(self, amount):
- self.amount = amount
- def getAmount(self):
- return self.amount
- def setAverageMark(self, averageMark):
- self.averageMark = averageMark
- def getAverageMark(self):
- return self.averageMark
- def Center(toplevel):
- toplevel.update_idletasks()
- w = toplevel.winfo_screenwidth()
- h = toplevel.winfo_screenheight()
- size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
- x = w / 2 - size[0] / 2
- y = h / 2 - size[1] / 2
- toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))
- def OnOpen():
- ftypes = [('Python files', '*.txt'), ('All files', '*')]
- dlg = tkinter.filedialog.Open(filetypes=ftypes)
- fl = dlg.show()
- if fl != '':
- print(fl)
- ReadFileText(fl)
- def OnSave():
- file = open(path, 'w')
- result = ''
- for i in range(0, len(arrayStatement)):
- if (i < len(arrayStatement) - 1):
- result += arrayStatement[i].getSurname() + '\t' + str(arrayStatement[i].getAmount()) + '\t' + str(
- arrayStatement[i].getAverageMark()) + '\n'
- else:
- result += arrayStatement[i].getSurname() + '\t' + str(arrayStatement[i].getAmount()) + '\t' + str(
- arrayStatement[i].getAverageMark())
- print(arrayStatement[i].getAverageMark())
- file.write(result)
- file.close()
- def ReadFileText(arg):
- global path, screen, root, arrayStatement
- path = arg
- file = open(path, encoding="utf8")
- inputFile = []
- arrayStatement = []
- for line in file:
- row = [i for i in line.split('\t')]
- inputFile.append(row)
- print("start open")
- countId = 0
- for line in inputFile:
- countId += 1
- arrayStatement.append(Statement(countId, line[0], int(line[1]), float(line[2].replace("\n", ""))))
- for i in range(0, len(arrayStatement)):
- print(arrayStatement[i].getSurname())
- if (screen == 0):
- screen = TableScreen(root)
- screen.pack(side="top", fill="both", expand=True)
- screen.LoadTable(arrayStatement)
- file.close()
- # ---1.2
- def AddStudent():
- addWindow = tkinter.Tk()
- addWindow.geometry('225x250')
- addWindow.title("Add")
- Center(addWindow)
- global surnameEntryBox, amountEntryBox, averageMarkEntryBox
- surnameLabel = tkinter.Label(addWindow, text='Enter a surname')
- surnameLabel.pack(side=tkinter.TOP)
- surnameEntryBox = tkinter.Entry(addWindow)
- surnameEntryBox.focus_set()
- surnameEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # 2
- amountLabel = tkinter.Label(addWindow, text='Enter a amount')
- amountLabel.pack(side=tkinter.TOP)
- amountEntryBox = tkinter.Entry(addWindow)
- amountEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # 3
- countAverageMarkLabel = tkinter.Label(addWindow, text='Enter a average mark')
- countAverageMarkLabel.pack(side=tkinter.TOP)
- averageMarkEntryBox = tkinter.Entry(addWindow)
- averageMarkEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- mySubmitButton = tkinter.Button(addWindow, text='Add', height=1, width=16, command=AddItem)
- mySubmitButton.pack()
- def AddItem():
- print(surnameEntryBox.get())
- print(amountEntryBox.get())
- print(averageMarkEntryBox.get())
- arrayStatement.append(
- Statement(len(arrayStatement) + 1, surnameEntryBox.get(), int(amountEntryBox.get()), float(averageMarkEntryBox.get())))
- screen.LoadTable(arrayStatement)
- # ---2.3
- def InsertStudent():
- insertWindow = tkinter.Tk()
- insertWindow.geometry('225x290')
- insertWindow.title("Insert")
- Center(insertWindow)
- global indexEntryBox, surnameEntryBox, amountEntryBox, averageMarkEntryBox
- indexLabel = tkinter.Label(insertWindow, text='Insert before index [1-' + str(len(arrayStatement)) + ']')
- indexLabel.pack(side=tkinter.TOP)
- indexEntryBox = tkinter.Entry(insertWindow)
- indexEntryBox.focus_set()
- indexEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # 1
- surnameLabel = tkinter.Label(insertWindow, text='Enter a surname')
- surnameLabel.pack(side=tkinter.TOP)
- surnameEntryBox = tkinter.Entry(insertWindow)
- surnameEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # 2
- amountLabel = tkinter.Label(insertWindow, text='Enter a amount')
- amountLabel.pack(side=tkinter.TOP)
- amountEntryBox = tkinter.Entry(insertWindow)
- amountEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # 3
- countAverageMarkLabel = tkinter.Label(insertWindow, text='Enter a average mark')
- countAverageMarkLabel.pack(side=tkinter.TOP)
- averageMarkEntryBox = tkinter.Entry(insertWindow)
- averageMarkEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- mySubmitButton = tkinter.Button(insertWindow, text='Insert', height=1, width=16, command=InsertItem)
- mySubmitButton.pack()
- def InsertItem():
- print(indexEntryBox.get())
- print(surnameEntryBox.get())
- print(amountEntryBox.get())
- print(averageMarkEntryBox.get())
- if (0 <= int(indexEntryBox.get()) - 1 < len(arrayStatement)):
- arrayStatement.insert(int(indexEntryBox.get()) - 1,
- Statement(int(indexEntryBox.get()), surnameEntryBox.get(), int(amountEntryBox.get()),
- float(averageMarkEntryBox.get())))
- for i in range(len(arrayStatement)):
- arrayStatement[i].setId(i + 1)
- screen.LoadTable(arrayStatement)
- else:
- print('Invalid index')
- # ---2.6
- def DeleteStudent():
- deleteWindow = tkinter.Tk()
- deleteWindow.geometry('225x100')
- deleteWindow.title("Delete")
- Center(deleteWindow)
- global indexEntryBox
- indexLabel = tkinter.Label(deleteWindow, text='Insert before index [1-' + str(len(arrayStatement)) + ']')
- indexLabel.pack(side=tkinter.TOP)
- indexEntryBox = tkinter.Entry(deleteWindow)
- indexEntryBox.focus_set()
- indexEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- mySubmitButton = tkinter.Button(deleteWindow, text='Delete', height=1, width=16, command=DeleteItem)
- mySubmitButton.pack()
- def DeleteItem():
- global arrayStatement
- if (0 <= int(indexEntryBox.get()) - 1 < len(arrayStatement)):
- index = int(indexEntryBox.get()) - 1
- arrayStatement = arrayStatement[:index]
- screen.LoadTable(arrayStatement)
- else:
- print('Invalid index')
- screen.LoadTable(arrayStatement)
- # ---2.8
- def SortStudents():
- sortWindow = tkinter.Tk()
- sortWindow.geometry('225x250')
- sortWindow.title("Sort")
- Center(sortWindow)
- global indexFromEntryBox, indexToEntryBox, variableSortBy, variableSortReverse
- # from
- indexFromLabel = tkinter.Label(sortWindow, text='Index from [1-' + str(len(arrayStatement)) + ']')
- indexFromLabel.pack(side=tkinter.TOP)
- indexFromEntryBox = tkinter.Entry(sortWindow)
- indexFromEntryBox.focus_set()
- indexFromEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # to
- indexToLabel = tkinter.Label(sortWindow, text='Index to [1-' + str(len(arrayStatement)) + ']')
- indexToLabel.pack(side=tkinter.TOP)
- indexToEntryBox = tkinter.Entry(sortWindow)
- indexToEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
- # sortBy
- sortByLabel = tkinter.Label(sortWindow, text='Sort by')
- sortByLabel.pack(side=tkinter.TOP)
- variableSortBy = tkinter.StringVar(sortWindow)
- variableSortBy.set("Id") # default value
- sortOptionMenu = tkinter.OptionMenu(sortWindow, variableSortBy, "Id", "Surname", "Amount", "Average Mark")
- sortOptionMenu.pack(side=tkinter.TOP)
- # reverse
- reverseLabel = tkinter.Label(sortWindow, text='Reverse sort')
- reverseLabel.pack(side=tkinter.TOP)
- variableSortReverse = tkinter.IntVar(sortWindow)
- variableSortReverse.set(0) # default value
- checkbutton = tkinter.Checkbutton(sortWindow, variable=variableSortReverse)
- checkbutton.pack(side=tkinter.TOP)
- # button
- mySubmitButton = tkinter.Button(sortWindow, text='Sort', height=1, width=16, command=SortItem)
- mySubmitButton.pack()
- def SortItem():
- global arrayStatement
- print(indexFromEntryBox.get())
- print(indexToEntryBox.get())
- print(variableSortBy.get())
- print(variableSortReverse.get())
- if ((0 <= int(indexFromEntryBox.get()) - 1 < len(arrayStatement))
- and (0 <= int(indexToEntryBox.get()) - 1 < len(arrayStatement))
- and (int(indexFromEntryBox.get()) - 1 < int(indexToEntryBox.get()) - 1)):
- global sortArrayStudents
- sortArrayStudents = arrayStatement[int(indexFromEntryBox.get()) - 1:int(indexToEntryBox.get())]
- if (variableSortBy.get() == 'Id'):
- sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getId(), reverse=variableSortReverse.get())
- elif (variableSortBy.get() == 'Surname'):
- sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getSurname().lower(), reverse=variableSortReverse.get())
- elif (variableSortBy.get() == 'Amount'):
- sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getAmount(), reverse=variableSortReverse.get())
- elif (variableSortBy.get() == 'Average Mark'):
- sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getAverageMark(), reverse=variableSortReverse.get())
- for i in range(len(sortArrayStudents)):
- print(sortArrayStudents[i].getSurname(), sortArrayStudents[i].getAmount(), sortArrayStudents[i].getAverageMark())
- screen.LoadTable(sortArrayStudents)
- averageIndex = math.floor(len(sortArrayStudents)/2)
- AverageValue(averageIndex)
- else:
- print('Invalid index')
- def AverageValue(averageIndex):
- averageWindow = tkinter.Tk()
- averageWindow.geometry('225x250')
- averageWindow.title("Average value")
- Center(averageWindow)
- global surnameEntryBox, amountEntryBox, averageMarkEntryBox
- surnameLabel = tkinter.Label(averageWindow, text=sortArrayStudents[averageIndex].getSurname())
- surnameLabel.pack(side=tkinter.TOP)
- # 2
- amountLabel = tkinter.Label(averageWindow, text=sortArrayStudents[averageIndex].getAmount())
- amountLabel.pack(side=tkinter.TOP)
- # 3
- countAverageMarkLabel = tkinter.Label(averageWindow, text=sortArrayStudents[averageIndex].getAverageMark())
- countAverageMarkLabel.pack(side=tkinter.TOP)
- mySubmitButton = tkinter.Button(averageWindow, text='Ok', height=1, width=16, command=averageWindow.destroy)
- mySubmitButton.pack()
- class TableScreen(tkinter.Frame):
- def __init__(self, parent):
- ttk.Frame.__init__(self, parent)
- if (tableIsCreated == 0):
- self.CreateUI()
- self.LoadTable(arrayStatement)
- parent.grid_rowconfigure(0, weight=1)
- parent.grid_columnconfigure(0, weight=1)
- def CreateUI(self):
- tv = ttk.Treeview(self)
- tv['columns'] = ('surname', 'amount', 'averageMark')
- tv.heading("#0", text='Id')
- tv.column("#0", width=1)
- tv.heading('surname', text='Surname')
- tv.column('surname', anchor='center', width=100)
- tv.heading('amount', text='Amount')
- tv.column('amount', anchor='center', width=100)
- tv.heading('averageMark', text='Average Mark')
- tv.column('averageMark', anchor='center', width=100)
- tv.grid(sticky=(tkinter.N, tkinter.S, tkinter.W, tkinter.E))
- self.treeview = tv
- self.grid_rowconfigure(0, weight=1)
- self.grid_columnconfigure(0, weight=1)
- global tableIsCreated
- tableIsCreated = 1
- def LoadTable(self, arr):
- for i in self.treeview.get_children():
- self.treeview.delete(i)
- for i in range(len(arr)):
- self.treeview.insert('', 'end', text=str(arr[i].getId()),
- values=(arr[i].getSurname(), arr[i].getAmount(), arr[i].getAverageMark()))
- def main():
- global root, arrayStatement, tableIsCreated, screen
- root = tkinter.Tk()
- root.geometry('750x500')
- root.title("Students")
- arrayStatement = []
- tableIsCreated = 0
- screen = 0
- menubar = tkinter.Menu(root)
- filemenu = tkinter.Menu(menubar, tearoff=0)
- filemenu.add_command(label="Open", command=OnOpen)
- filemenu.add_command(label="Save", command=OnSave)
- filemenu.add_separator()
- filemenu.add_command(label="Exit", command=root.quit)
- editmenu = tkinter.Menu(menubar, tearoff=0)
- editmenu.add_command(label="Add Student", command=AddStudent)
- editmenu.add_command(label="Insert", command=InsertStudent)
- editmenu.add_command(label="Delete", command=DeleteStudent)
- menubar.add_cascade(label="File", menu=filemenu)
- menubar.add_cascade(label="Edit", menu=editmenu)
- menubar.add_command(label="Sort", command=SortStudents)
- root.config(menu=menubar)
- Center(root)
- root.mainloop()
- if __name__ == "__main__":
- main()
- #database.txt
- Семенов 1890 4.5
- Васильев 930 4.0
- Петрова 1789 4.6
- Иванов 983 5.0
- Аристов 984 3.5
- Крылова 1294 3.6
- Попов 1595 4.0
- Кузнецов 899 4.7
- Смирнова 2395 3.1
- Соколова 2289 4.9
- Павлов 983 4.3
- Зайцева 834 4.4
Advertisement
Add Comment
Please, Sign In to add comment