Advertisement
Xom9ik

Course_work/4var (IV semester) .py

May 26th, 2018
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.88 KB | None | 0 0
  1. # Course_work/15var (IV semester) .py
  2. import tkinter
  3. import tkinter.ttk as ttk
  4. import tkinter.filedialog
  5.  
  6.  
  7. class WorldRecords:
  8.     def __init__(self, id, result, author, year):
  9.         self.id = id
  10.         self.result = result
  11.         self.author = author
  12.         self.year = year
  13.  
  14.     def setId(self, id):
  15.         self.id = id
  16.  
  17.     def getId(self):
  18.         return self.id
  19.  
  20.     def setresult(self, result):
  21.         self.result = result
  22.  
  23.     def getresult(self):
  24.         return self.result
  25.  
  26.     def setauthor(self, author):
  27.         self.author = author
  28.  
  29.     def getauthor(self):
  30.         return self.author
  31.  
  32.     def setyear(self, year):
  33.         self.year = year
  34.  
  35.     def getyear(self):
  36.         return self.year
  37.  
  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(arrayWorldRecords)):
  62.         if (i < len(arrayWorldRecords) - 1):
  63.             result += str(arrayWorldRecords[i].getresult()) + '\t' + str(arrayWorldRecords[i].getauthor()) + '\t' + str(
  64.                 arrayWorldRecords[i].getyear()) + '\n'
  65.         else:
  66.             result += str(arrayWorldRecords[i].getresult()) + '\t' + str(arrayWorldRecords[i].getauthor()) + '\t' + str(
  67.                 arrayWorldRecords[i].getyear())
  68.         print(arrayWorldRecords[i].getyear())
  69.     file.write(result)
  70.     file.close()
  71.  
  72.  
  73. def ReadFileText(arg):
  74.     global path, screen, root, arrayWorldRecords
  75.     path = arg
  76.     file = open(path, 'rt')
  77.     inputFile = []
  78.     arrayWorldRecords = []
  79.  
  80.     for line in file:
  81.         row = [i for i in line.split('\t')]
  82.         inputFile.append(row)
  83.     countId = 0
  84.     for line in inputFile:
  85.         countId += 1
  86.         arrayWorldRecords.append(WorldRecords(countId, float(line[0]), line[1], int(line[2].replace("\n", ""))))
  87.  
  88.     for i in range(0, len(arrayWorldRecords)):
  89.         print(arrayWorldRecords[i].getauthor())
  90.  
  91.     if (screen == 0):
  92.         screen = TableScreen(root)
  93.         screen.pack(side="top", fill="both", expand=True)
  94.     screen.LoadTable(arrayWorldRecords)
  95.     file.close()
  96.  
  97.  
  98. # ---1.2
  99. def AddWorldRecord():
  100.     addWindow = tkinter.Tk()
  101.     addWindow.geometry('225x250')
  102.     addWindow.title("Add")
  103.     Center(addWindow)
  104.     global resultEntryBox, authorEntryBox, recordEntryBox
  105.     resultLabel = tkinter.Label(addWindow, text='Enter a result')
  106.     resultLabel.pack(side=tkinter.TOP)
  107.     resultEntryBox = tkinter.Entry(addWindow)
  108.     resultEntryBox.focus_set()
  109.     resultEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  110.     # 2
  111.     authorLabel = tkinter.Label(addWindow, text='Enter a author')
  112.     authorLabel.pack(side=tkinter.TOP)
  113.     authorEntryBox = tkinter.Entry(addWindow)
  114.     authorEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  115.     # 3
  116.     countRecordLabel = tkinter.Label(addWindow, text='Enter a year')
  117.     countRecordLabel.pack(side=tkinter.TOP)
  118.     recordEntryBox = tkinter.Entry(addWindow)
  119.     recordEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  120.  
  121.     mySubmitButton = tkinter.Button(addWindow, text='Add', height=1, width=16, command=AddItem)
  122.     mySubmitButton.pack()
  123.  
  124.  
  125. def AddItem():
  126.     print(resultEntryBox.get())
  127.     print(authorEntryBox.get())
  128.     print(recordEntryBox.get())
  129.     arrayWorldRecords.append(
  130.         WorldRecords(len(arrayWorldRecords) + 1, float(resultEntryBox.get()), authorEntryBox.get(), int(recordEntryBox.get())))
  131.     global screen
  132.     if (screen == 0):
  133.         screen = TableScreen(root)
  134.         screen.pack(side="top", fill="both", expand=True)
  135.     screen.LoadTable(arrayWorldRecords)
  136.  
  137.  
  138. # ---2.3
  139. def InsertBefore():
  140.     insertWindow = tkinter.Tk()
  141.     insertWindow.geometry('225x290')
  142.     insertWindow.title("Insert")
  143.     Center(insertWindow)
  144.     global indexEntryBox, resultEntryBox, authorEntryBox, recordEntryBox
  145.  
  146.     indexLabel = tkinter.Label(insertWindow, text='Insert before index [1-' + str(len(arrayWorldRecords)) + ']')
  147.     indexLabel.pack(side=tkinter.TOP)
  148.     indexEntryBox = tkinter.Entry(insertWindow)
  149.     indexEntryBox.focus_set()
  150.     indexEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  151.     # 1
  152.     resultLabel = tkinter.Label(insertWindow, text='Enter a result')
  153.     resultLabel.pack(side=tkinter.TOP)
  154.     resultEntryBox = tkinter.Entry(insertWindow)
  155.     resultEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  156.     # 2
  157.     authorLabel = tkinter.Label(insertWindow, text='Enter a author')
  158.     authorLabel.pack(side=tkinter.TOP)
  159.     authorEntryBox = tkinter.Entry(insertWindow)
  160.     authorEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  161.     # 3
  162.     countRecordLabel = tkinter.Label(insertWindow, text='Enter a year')
  163.     countRecordLabel.pack(side=tkinter.TOP)
  164.     recordEntryBox = tkinter.Entry(insertWindow)
  165.     recordEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  166.  
  167.     mySubmitButton = tkinter.Button(insertWindow, text='Insert before', height=1, width=16, command=InsertItemBefore)
  168.     mySubmitButton.pack()
  169.  
  170.  
  171. def InsertItemBefore():
  172.     print(indexEntryBox.get())
  173.     print(resultEntryBox.get())
  174.     print(authorEntryBox.get())
  175.     print(recordEntryBox.get())
  176.     if (0 <= int(indexEntryBox.get()) - 1 < len(arrayWorldRecords)):
  177.         arrayWorldRecords.insert(int(indexEntryBox.get()) - 1,
  178.                             WorldRecords(int(indexEntryBox.get()), float(resultEntryBox.get()), authorEntryBox.get(),
  179.                                     int(recordEntryBox.get())))
  180.         for i in range(len(arrayWorldRecords)):
  181.             arrayWorldRecords[i].setId(i + 1)
  182.         screen.LoadTable(arrayWorldRecords)
  183.     else:
  184.         print('Invalid index')
  185.  
  186. # ---2.4
  187. def InsertAfter():
  188.     insertWindow = tkinter.Tk()
  189.     insertWindow.geometry('225x290')
  190.     insertWindow.title("Insert")
  191.     Center(insertWindow)
  192.     global indexEntryBox, resultEntryBox, authorEntryBox, recordEntryBox
  193.  
  194.     indexLabel = tkinter.Label(insertWindow, text='Insert after index [1-' + str(len(arrayWorldRecords)) + ']')
  195.     indexLabel.pack(side=tkinter.TOP)
  196.     indexEntryBox = tkinter.Entry(insertWindow)
  197.     indexEntryBox.focus_set()
  198.     indexEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  199.     # 1
  200.     resultLabel = tkinter.Label(insertWindow, text='Enter a result')
  201.     resultLabel.pack(side=tkinter.TOP)
  202.     resultEntryBox = tkinter.Entry(insertWindow)
  203.     resultEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  204.     # 2
  205.     authorLabel = tkinter.Label(insertWindow, text='Enter a author')
  206.     authorLabel.pack(side=tkinter.TOP)
  207.     authorEntryBox = tkinter.Entry(insertWindow)
  208.     authorEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  209.     # 3
  210.     countRecordLabel = tkinter.Label(insertWindow, text='Enter a year')
  211.     countRecordLabel.pack(side=tkinter.TOP)
  212.     recordEntryBox = tkinter.Entry(insertWindow)
  213.     recordEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  214.  
  215.     mySubmitButton = tkinter.Button(insertWindow, text='Insert after', height=1, width=16, command=InsertItemAfter)
  216.     mySubmitButton.pack()
  217.  
  218.  
  219. def InsertItemAfter():
  220.     print(indexEntryBox.get())
  221.     print(resultEntryBox.get())
  222.     print(authorEntryBox.get())
  223.     print(recordEntryBox.get())
  224.     if (0 <= int(indexEntryBox.get()) - 1 < len(arrayWorldRecords)):
  225.         arrayWorldRecords.insert(int(indexEntryBox.get()),
  226.                             WorldRecords(int(indexEntryBox.get()), float(resultEntryBox.get()), authorEntryBox.get(),
  227.                                     int(recordEntryBox.get())))
  228.         for i in range(len(arrayWorldRecords)):
  229.             arrayWorldRecords[i].setId(i + 1)
  230.         screen.LoadTable(arrayWorldRecords)
  231.     else:
  232.         print('Invalid index')
  233.  
  234. # ---2.8
  235. def SortWorldRecord():
  236.     sortWindow = tkinter.Tk()
  237.     sortWindow.geometry('225x250')
  238.     sortWindow.title("Sort")
  239.     Center(sortWindow)
  240.     global indexFromEntryBox, indexToEntryBox, variableSortBy, variableSortReverse
  241.     # from
  242.     indexFromLabel = tkinter.Label(sortWindow, text='Index from [1-' + str(len(arrayWorldRecords)) + ']')
  243.     indexFromLabel.pack(side=tkinter.TOP)
  244.     indexFromEntryBox = tkinter.Entry(sortWindow)
  245.     indexFromEntryBox.focus_set()
  246.     indexFromEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  247.     # to
  248.     indexToLabel = tkinter.Label(sortWindow, text='Index to [1-' + str(len(arrayWorldRecords)) + ']')
  249.     indexToLabel.pack(side=tkinter.TOP)
  250.     indexToEntryBox = tkinter.Entry(sortWindow)
  251.     indexToEntryBox.pack(side=tkinter.TOP, pady=10, padx=10)
  252.     # sortBy
  253.     sortByLabel = tkinter.Label(sortWindow, text='Sort by')
  254.     sortByLabel.pack(side=tkinter.TOP)
  255.     variableSortBy = tkinter.StringVar(sortWindow)
  256.     variableSortBy.set("Id")  # default value
  257.     sortOptionMenu = tkinter.OptionMenu(sortWindow, variableSortBy, "Id", "result", "author", "Year")
  258.     sortOptionMenu.pack(side=tkinter.TOP)
  259.     # reverse
  260.     reverseLabel = tkinter.Label(sortWindow, text='Reverse sort')
  261.     reverseLabel.pack(side=tkinter.TOP)
  262.     variableSortReverse = tkinter.IntVar(sortWindow)
  263.     variableSortReverse.set(0)  # default value
  264.     checkbutton = tkinter.Checkbutton(sortWindow, variable=variableSortReverse)
  265.     checkbutton.pack(side=tkinter.TOP)
  266.     # button
  267.     mySubmitButton = tkinter.Button(sortWindow, text='Sort', height=1, width=16, command=SortItem)
  268.     mySubmitButton.pack()
  269.  
  270.  
  271. def SortItem():
  272.     global arrayWorldRecords
  273.     print(indexFromEntryBox.get())
  274.     print(indexToEntryBox.get())
  275.     print(variableSortBy.get())
  276.     print(variableSortReverse.get())
  277.     if ((0 <= int(indexFromEntryBox.get()) - 1 < len(arrayWorldRecords))
  278.         and (0 <= int(indexToEntryBox.get()) - 1 < len(arrayWorldRecords))
  279.         and (int(indexFromEntryBox.get()) - 1 < int(indexToEntryBox.get()) - 1)):
  280.  
  281.         sortArrayWorldRecord = arrayWorldRecords[int(indexFromEntryBox.get()) - 1:int(indexToEntryBox.get())]
  282.  
  283.         if (variableSortBy.get() == 'Id'):
  284.             sortArrayWorldRecord = sorted(sortArrayWorldRecord, key=lambda x: x.getId(), reverse=variableSortReverse.get())
  285.         elif (variableSortBy.get() == 'result'):
  286.             sortArrayWorldRecord = sorted(sortArrayWorldRecord, key=lambda x: x.getresult(), reverse=variableSortReverse.get())
  287.         elif (variableSortBy.get() == 'author'):
  288.             sortArrayWorldRecord = sorted(sortArrayWorldRecord, key=lambda x: x.getauthor(), reverse=variableSortReverse.get())
  289.         elif (variableSortBy.get() == 'Year'):
  290.             sortArrayWorldRecord = sorted(sortArrayWorldRecord, key=lambda x: x.getyear(), reverse=variableSortReverse.get())
  291.  
  292.         for i in range(len(sortArrayWorldRecord)):
  293.             print(sortArrayWorldRecord[i].getresult(), sortArrayWorldRecord[i].getauthor(), sortArrayWorldRecord[i].getyear())
  294.         screen.LoadTable(sortArrayWorldRecord)
  295.     else:
  296.         print('Invalid index')
  297.  
  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(arrayWorldRecords)
  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'] = ('result', 'author', 'year')
  311.         tv.heading("#0", text='Id')
  312.         tv.column("#0", width=1)
  313.         tv.heading('result', text='Result')
  314.         tv.column('result', anchor='center', width=100)
  315.         tv.heading('author', text='Author')
  316.         tv.column('author', anchor='center', width=100)
  317.         tv.heading('year', text='Year')
  318.         tv.column('year', 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.             print(arr[i].getId())
  331.             print(arr[i].getresult())
  332.             print(arr[i].getauthor())
  333.             print(arr[i].getyear())
  334.             self.treeview.insert('', 'end', text=str(arr[i].getId()),
  335.                                  values=(arr[i].getresult(), arr[i].getauthor(), arr[i].getyear()))
  336.  
  337.  
  338. def main():
  339.     global root, arrayWorldRecords, tableIsCreated, screen
  340.     root = tkinter.Tk()
  341.     root.geometry('750x500')
  342.     root.title("World Records")
  343.  
  344.     arrayWorldRecords = []
  345.     tableIsCreated = 0
  346.     screen = 0
  347.  
  348.     menubar = tkinter.Menu(root)
  349.  
  350.     filemenu = tkinter.Menu(menubar, tearoff=0)
  351.     filemenu.add_command(label="Open", command=OnOpen)
  352.     filemenu.add_command(label="Save", command=OnSave)
  353.     filemenu.add_separator()
  354.     filemenu.add_command(label="Exit", command=root.quit)
  355.  
  356.     editmenu = tkinter.Menu(menubar, tearoff=0)
  357.     editmenu.add_command(label="Add World Record", command=AddWorldRecord)
  358.     editmenu.add_command(label="Insert before", command=InsertBefore)
  359.     editmenu.add_command(label="Insert after", command=InsertAfter)
  360.  
  361.     menubar.add_cascade(label="File", menu=filemenu)
  362.     menubar.add_cascade(label="Edit", menu=editmenu)
  363.     menubar.add_command(label="Sort", command=SortWorldRecord)
  364.     root.config(menu=menubar)
  365.  
  366.     Center(root)
  367.     root.mainloop()
  368.  
  369.  
  370. if __name__ == "__main__":
  371.     main()
  372.  
  373. # Example database.txt
  374. 4.7 Рекрутов Виктор   1998
  375. 2.5 Геннадий Крот   1974
  376. 3.5 Александр Литов   2001
  377. 4.6 Жорик Ардамов   2004
  378. 5.0 Кирилл Рыбак 1999
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement