Xom9ik

Course_work/7var (IV semester) .py

Apr 11th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.67 KB | None | 0 0
  1. import tkinter
  2. import tkinter.ttk as ttk
  3. import tkinter.filedialog
  4.  
  5. import math
  6.  
  7.  
  8. class Statement:
  9.     def __init__(self, id, surname, amount, averageMark):
  10.         self.id = id
  11.         self.surname = surname
  12.         self.amount = amount
  13.         self.averageMark = averageMark
  14.  
  15.     def setId(self, id):
  16.         self.id = id
  17.  
  18.     def getId(self):
  19.         return self.id
  20.  
  21.     def setSurname(self, surname):
  22.         self.surname = surname
  23.  
  24.     def getSurname(self):
  25.         return self.surname
  26.  
  27.     def setAmount(self, amount):
  28.         self.amount = amount
  29.  
  30.     def getAmount(self):
  31.         return self.amount
  32.  
  33.     def setAverageMark(self, averageMark):
  34.         self.averageMark = averageMark
  35.  
  36.     def getAverageMark(self):
  37.         return self.averageMark
  38.  
  39. def Center(toplevel):
  40.     toplevel.update_idletasks()
  41.     w = toplevel.winfo_screenwidth()
  42.     h = toplevel.winfo_screenheight()
  43.     size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
  44.     x = w / 2 - size[0] / 2
  45.     y = h / 2 - size[1] / 2
  46.     toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))
  47.  
  48.  
  49. def OnOpen():
  50.     ftypes = [('Python files', '*.txt'), ('All files', '*')]
  51.     dlg = tkinter.filedialog.Open(filetypes=ftypes)
  52.     fl = dlg.show()
  53.     if fl != '':
  54.         print(fl)
  55.         ReadFileText(fl)
  56.  
  57.  
  58. def OnSave():
  59.     file = open(path, 'w')
  60.     result = ''
  61.     for i in range(0, len(arrayStatement)):
  62.         if (i < len(arrayStatement) - 1):
  63.             result += arrayStatement[i].getSurname() + '\t' + str(arrayStatement[i].getAmount()) + '\t' + str(
  64.                 arrayStatement[i].getAverageMark()) + '\n'
  65.         else:
  66.             result += arrayStatement[i].getSurname() + '\t' + str(arrayStatement[i].getAmount()) + '\t' + str(
  67.                 arrayStatement[i].getAverageMark())
  68.         print(arrayStatement[i].getAverageMark())
  69.     file.write(result)
  70.     file.close()
  71.  
  72.  
  73. def ReadFileText(arg):
  74.     global path, screen, root, arrayStatement
  75.     path = arg
  76.     file = open(path, encoding="utf8")
  77.     inputFile = []
  78.     arrayStatement = []
  79.  
  80.     for line in file:
  81.         row = [i for i in line.split('\t')]
  82.         inputFile.append(row)
  83.     print("start open")
  84.  
  85.     countId = 0
  86.     for line in inputFile:
  87.         countId += 1
  88.         arrayStatement.append(Statement(countId, line[0], int(line[1]), float(line[2].replace("\n", ""))))
  89.  
  90.     for i in range(0, len(arrayStatement)):
  91.         print(arrayStatement[i].getSurname())
  92.  
  93.     if (screen == 0):
  94.         screen = TableScreen(root)
  95.         screen.pack(side="top", fill="both", expand=True)
  96.     screen.LoadTable(arrayStatement)
  97.     file.close()
  98.  
  99.  
  100. # ---1.2
  101. def AddStudent():
  102.     addWindow = tkinter.Tk()
  103.     addWindow.geometry('225x250')
  104.     addWindow.title("Add")
  105.     Center(addWindow)
  106.     global surnameEntryBox, amountEntryBox, averageMarkEntryBox
  107.     surnameLabel = tkinter.Label(addWindow, text='Enter a surname')
  108.     surnameLabel.pack(side=tkinter.TOP)
  109.     surnameEntryBox = tkinter.Entry(addWindow)
  110.     surnameEntryBox.focus_set()
  111.     surnameEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  112.     # 2
  113.     amountLabel = tkinter.Label(addWindow, text='Enter a amount')
  114.     amountLabel.pack(side=tkinter.TOP)
  115.     amountEntryBox = tkinter.Entry(addWindow)
  116.     amountEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  117.     # 3
  118.     countAverageMarkLabel = tkinter.Label(addWindow, text='Enter a average mark')
  119.     countAverageMarkLabel.pack(side=tkinter.TOP)
  120.     averageMarkEntryBox = tkinter.Entry(addWindow)
  121.     averageMarkEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  122.  
  123.     mySubmitButton = tkinter.Button(addWindow, text='Add', height=1, width=16, command=AddItem)
  124.     mySubmitButton.pack()
  125.  
  126.  
  127. def AddItem():
  128.     print(surnameEntryBox.get())
  129.     print(amountEntryBox.get())
  130.     print(averageMarkEntryBox.get())
  131.     arrayStatement.append(
  132.         Statement(len(arrayStatement) + 1, surnameEntryBox.get(), int(amountEntryBox.get()), float(averageMarkEntryBox.get())))
  133.     screen.LoadTable(arrayStatement)
  134.  
  135.  
  136. # ---2.3
  137. def InsertStudent():
  138.     insertWindow = tkinter.Tk()
  139.     insertWindow.geometry('225x290')
  140.     insertWindow.title("Insert")
  141.     Center(insertWindow)
  142.     global indexEntryBox, surnameEntryBox, amountEntryBox, averageMarkEntryBox
  143.  
  144.     indexLabel = tkinter.Label(insertWindow, text='Insert before index [1-' + str(len(arrayStatement)) + ']')
  145.     indexLabel.pack(side=tkinter.TOP)
  146.     indexEntryBox = tkinter.Entry(insertWindow)
  147.     indexEntryBox.focus_set()
  148.     indexEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  149.     # 1
  150.     surnameLabel = tkinter.Label(insertWindow, text='Enter a surname')
  151.     surnameLabel.pack(side=tkinter.TOP)
  152.     surnameEntryBox = tkinter.Entry(insertWindow)
  153.     surnameEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  154.     # 2
  155.     amountLabel = tkinter.Label(insertWindow, text='Enter a amount')
  156.     amountLabel.pack(side=tkinter.TOP)
  157.     amountEntryBox = tkinter.Entry(insertWindow)
  158.     amountEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  159.     # 3
  160.     countAverageMarkLabel = tkinter.Label(insertWindow, text='Enter a average mark')
  161.     countAverageMarkLabel.pack(side=tkinter.TOP)
  162.     averageMarkEntryBox = tkinter.Entry(insertWindow)
  163.     averageMarkEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  164.  
  165.     mySubmitButton = tkinter.Button(insertWindow, text='Insert', height=1, width=16, command=InsertItem)
  166.     mySubmitButton.pack()
  167.  
  168.  
  169. def InsertItem():
  170.     print(indexEntryBox.get())
  171.     print(surnameEntryBox.get())
  172.     print(amountEntryBox.get())
  173.     print(averageMarkEntryBox.get())
  174.     if (0 <= int(indexEntryBox.get()) - 1 < len(arrayStatement)):
  175.         arrayStatement.insert(int(indexEntryBox.get()) - 1,
  176.                             Statement(int(indexEntryBox.get()), surnameEntryBox.get(), int(amountEntryBox.get()),
  177.                                     float(averageMarkEntryBox.get())))
  178.         for i in range(len(arrayStatement)):
  179.             arrayStatement[i].setId(i + 1)
  180.         screen.LoadTable(arrayStatement)
  181.     else:
  182.         print('Invalid index')
  183.  
  184.  
  185. # ---2.6
  186. def DeleteStudent():
  187.     deleteWindow = tkinter.Tk()
  188.     deleteWindow.geometry('225x100')
  189.     deleteWindow.title("Delete")
  190.     Center(deleteWindow)
  191.     global indexEntryBox
  192.     indexLabel = tkinter.Label(deleteWindow, text='Insert before index [1-' + str(len(arrayStatement)) + ']')
  193.     indexLabel.pack(side=tkinter.TOP)
  194.     indexEntryBox = tkinter.Entry(deleteWindow)
  195.     indexEntryBox.focus_set()
  196.     indexEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  197.  
  198.     mySubmitButton = tkinter.Button(deleteWindow, text='Delete', height=1, width=16, command=DeleteItem)
  199.     mySubmitButton.pack()
  200.  
  201.  
  202. def DeleteItem():
  203.     global arrayStatement
  204.     if (0 <= int(indexEntryBox.get()) - 1 < len(arrayStatement)):
  205.         index = int(indexEntryBox.get()) - 1
  206.         arrayStatement = arrayStatement[:index]
  207.         screen.LoadTable(arrayStatement)
  208.     else:
  209.         print('Invalid index')
  210.     screen.LoadTable(arrayStatement)
  211.  
  212.  
  213. # ---2.8
  214. def SortStudents():
  215.     sortWindow = tkinter.Tk()
  216.     sortWindow.geometry('225x250')
  217.     sortWindow.title("Sort")
  218.     Center(sortWindow)
  219.     global indexFromEntryBox, indexToEntryBox, variableSortBy, variableSortReverse
  220.     # from
  221.     indexFromLabel = tkinter.Label(sortWindow, text='Index from [1-' + str(len(arrayStatement)) + ']')
  222.     indexFromLabel.pack(side=tkinter.TOP)
  223.     indexFromEntryBox = tkinter.Entry(sortWindow)
  224.     indexFromEntryBox.focus_set()
  225.     indexFromEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  226.     # to
  227.     indexToLabel = tkinter.Label(sortWindow, text='Index to [1-' + str(len(arrayStatement)) + ']')
  228.     indexToLabel.pack(side=tkinter.TOP)
  229.     indexToEntryBox = tkinter.Entry(sortWindow)
  230.     indexToEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  231.     # sortBy
  232.     sortByLabel = tkinter.Label(sortWindow, text='Sort by')
  233.     sortByLabel.pack(side=tkinter.TOP)
  234.     variableSortBy = tkinter.StringVar(sortWindow)
  235.     variableSortBy.set("Id")  # default value
  236.     sortOptionMenu = tkinter.OptionMenu(sortWindow, variableSortBy, "Id", "Surname", "Amount", "Average Mark")
  237.     sortOptionMenu.pack(side=tkinter.TOP)
  238.     # reverse
  239.     reverseLabel = tkinter.Label(sortWindow, text='Reverse sort')
  240.     reverseLabel.pack(side=tkinter.TOP)
  241.     variableSortReverse = tkinter.IntVar(sortWindow)
  242.     variableSortReverse.set(0)  # default value
  243.     checkbutton = tkinter.Checkbutton(sortWindow, variable=variableSortReverse)
  244.     checkbutton.pack(side=tkinter.TOP)
  245.     # button
  246.     mySubmitButton = tkinter.Button(sortWindow, text='Sort', height=1, width=16, command=SortItem)
  247.     mySubmitButton.pack()
  248.  
  249.  
  250. def SortItem():
  251.     global arrayStatement
  252.     print(indexFromEntryBox.get())
  253.     print(indexToEntryBox.get())
  254.     print(variableSortBy.get())
  255.     print(variableSortReverse.get())
  256.     if ((0 <= int(indexFromEntryBox.get()) - 1 < len(arrayStatement))
  257.         and (0 <= int(indexToEntryBox.get()) - 1 < len(arrayStatement))
  258.         and (int(indexFromEntryBox.get()) - 1 < int(indexToEntryBox.get()) - 1)):
  259.  
  260.         global sortArrayStudents
  261.         sortArrayStudents = arrayStatement[int(indexFromEntryBox.get()) - 1:int(indexToEntryBox.get())]
  262.  
  263.         if (variableSortBy.get() == 'Id'):
  264.             sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getId(), reverse=variableSortReverse.get())
  265.         elif (variableSortBy.get() == 'Surname'):
  266.             sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getSurname().lower(), reverse=variableSortReverse.get())
  267.         elif (variableSortBy.get() == 'Amount'):
  268.             sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getAmount(), reverse=variableSortReverse.get())
  269.         elif (variableSortBy.get() == 'Average Mark'):
  270.             sortArrayStudents = sorted(sortArrayStudents, key=lambda x: x.getAverageMark(), reverse=variableSortReverse.get())
  271.  
  272.         for i in range(len(sortArrayStudents)):
  273.             print(sortArrayStudents[i].getSurname(), sortArrayStudents[i].getAmount(), sortArrayStudents[i].getAverageMark())
  274.         screen.LoadTable(sortArrayStudents)
  275.  
  276.         averageIndex = math.floor(len(sortArrayStudents)/2)
  277.         AverageValue(averageIndex)
  278.     else:
  279.         print('Invalid index')
  280.  
  281. def AverageValue(averageIndex):
  282.     averageWindow = tkinter.Tk()
  283.     averageWindow.geometry('225x250')
  284.     averageWindow.title("Average value")
  285.     Center(averageWindow)
  286.     global surnameEntryBox, amountEntryBox, averageMarkEntryBox
  287.     surnameLabel = tkinter.Label(averageWindow, text=sortArrayStudents[averageIndex].getSurname())
  288.     surnameLabel.pack(side=tkinter.TOP)
  289.     # 2
  290.     amountLabel = tkinter.Label(averageWindow, text=sortArrayStudents[averageIndex].getAmount())
  291.     amountLabel.pack(side=tkinter.TOP)
  292.     # 3
  293.     countAverageMarkLabel = tkinter.Label(averageWindow, text=sortArrayStudents[averageIndex].getAverageMark())
  294.     countAverageMarkLabel.pack(side=tkinter.TOP)
  295.  
  296.     mySubmitButton = tkinter.Button(averageWindow, text='Ok', height=1, width=16, command=averageWindow.destroy)
  297.     mySubmitButton.pack()
  298.  
  299. class TableScreen(tkinter.Frame):
  300.     def __init__(self, parent):
  301.         ttk.Frame.__init__(self, parent)
  302.         if (tableIsCreated == 0):
  303.             self.CreateUI()
  304.         self.LoadTable(arrayStatement)
  305.         parent.grid_rowconfigure(0, weight=1)
  306.         parent.grid_columnconfigure(0, weight=1)
  307.  
  308.     def CreateUI(self):
  309.         tv = ttk.Treeview(self)
  310.         tv['columns'] = ('surname', 'amount', 'averageMark')
  311.         tv.heading("#0", text='Id')
  312.         tv.column("#0", width=1)
  313.         tv.heading('surname', text='Surname')
  314.         tv.column('surname', anchor='center', width=100)
  315.         tv.heading('amount', text='Amount')
  316.         tv.column('amount', anchor='center', width=100)
  317.         tv.heading('averageMark', text='Average Mark')
  318.         tv.column('averageMark', anchor='center', width=100)
  319.         tv.grid(sticky=(tkinter.N, tkinter.S, tkinter.W, tkinter.E))
  320.         self.treeview = tv
  321.         self.grid_rowconfigure(0, weight=1)
  322.         self.grid_columnconfigure(0, weight=1)
  323.         global tableIsCreated
  324.         tableIsCreated = 1
  325.  
  326.     def LoadTable(self, arr):
  327.         for i in self.treeview.get_children():
  328.             self.treeview.delete(i)
  329.         for i in range(len(arr)):
  330.             self.treeview.insert('', 'end', text=str(arr[i].getId()),
  331.                                  values=(arr[i].getSurname(), arr[i].getAmount(), arr[i].getAverageMark()))
  332.  
  333.  
  334. def main():
  335.     global root, arrayStatement, tableIsCreated, screen
  336.     root = tkinter.Tk()
  337.     root.geometry('750x500')
  338.     root.title("Students")
  339.  
  340.     arrayStatement = []
  341.     tableIsCreated = 0
  342.     screen = 0
  343.  
  344.     menubar = tkinter.Menu(root)
  345.  
  346.     filemenu = tkinter.Menu(menubar, tearoff=0)
  347.     filemenu.add_command(label="Open", command=OnOpen)
  348.     filemenu.add_command(label="Save", command=OnSave)
  349.     filemenu.add_separator()
  350.     filemenu.add_command(label="Exit", command=root.quit)
  351.  
  352.     editmenu = tkinter.Menu(menubar, tearoff=0)
  353.     editmenu.add_command(label="Add Student", command=AddStudent)
  354.     editmenu.add_command(label="Insert", command=InsertStudent)
  355.     editmenu.add_command(label="Delete", command=DeleteStudent)
  356.  
  357.     menubar.add_cascade(label="File", menu=filemenu)
  358.     menubar.add_cascade(label="Edit", menu=editmenu)
  359.     menubar.add_command(label="Sort", command=SortStudents)
  360.     root.config(menu=menubar)
  361.  
  362.     Center(root)
  363.     root.mainloop()
  364.  
  365.  
  366. if __name__ == "__main__":
  367.     main()
  368.  
  369. #database.txt
  370. Семенов  1890    4.5
  371. Васильев    930 4.0
  372. Петрова  1789    4.6
  373. Иванов    983 5.0
  374. Аристов  984 3.5
  375. Крылова  1294    3.6
  376. Попов  1595    4.0
  377. Кузнецов    899 4.7
  378. Смирнова    2395    3.1
  379. Соколова    2289    4.9
  380. Павлов    983 4.3
  381. Зайцева  834 4.4
Advertisement
Add Comment
Please, Sign In to add comment