Advertisement
jimkilled

GRAPHICS V7 main.py

Dec 20th, 2020
698
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.75 KB | None | 0 0
  1. from tkinter import *
  2. from tkinter import ttk
  3. from tkinter import colorchooser
  4. from graphics import *
  5. from math import *
  6.  
  7.  
  8. def initialize_window(window, title, size=(1024, 720), sizable=(False, False)):
  9.     '''
  10.    Устанавливает заголовок окна, размеры по осям X, Y и устанавливает возможность изменения по осям X, Y
  11.    args - window (Tk), title (str), size (tuple(int, int)), sizable (tuple(bool, bool))
  12.    return - None
  13.    '''
  14.     window.title(title)
  15.     window.geometry(f'{size[0]}x{size[1]}')
  16.     window.resizable(sizable[0], sizable[1])
  17.  
  18.  
  19. def initialize_widgets(window, start, size=(1024, 720)):
  20.     MARK = Label(window, text='By George Golubev Lyceum №8. 2020', font=('Arial', 10, 'bold'))
  21.     MARK.place(x=1150, y=840)
  22.  
  23.     global canvas
  24.     canvas = Canvas(window, bg='#fff', width=size[0], height=size[1])
  25.     canvas.place(x=start[0], y=start[1])
  26.  
  27.     text = Label(window, text='y = ', font=('Arial', 13, 'bold'))
  28.     text.place(x=1060, y=355)
  29.  
  30.     but_func = Button(window, text='Сгенерировать', command=get_choosen_graphic_n_draw)
  31.     but_func.place(x=1165, y=380)
  32.  
  33.     but_erase_last_func = Button(window, width=11, text='Стереть', command=erase_graphic)
  34.     but_erase_last_func.place(x=1295, y=40)
  35.  
  36.     but_erase_all = Button(window, width=11, text='Стереть всё', command=erase_graphics)
  37.     but_erase_all.place(x=1295, y=70)
  38.  
  39.     but_hide_graph = Button(window, width=11, text='Скрыть', command=hideshow_graphic)
  40.     but_hide_graph.place(x=1295, y=100)
  41.  
  42.     global func_listbox
  43.     func_listbox = Listbox(window, width=25, height=20, selectmode=EXTENDED)
  44.     func_listbox.place(x=1135, y=20)
  45.  
  46.     # scroll = Scrollbar(window, command=func_listbox.yview, orient=VERTICAL)
  47.     # scroll.place(x=1329, y=20)
  48.  
  49.     # func_listbox.config(yscrollcommand=scroll.set)
  50.  
  51.     global func_choose, ent_first_coef, ent_second_coef
  52.     ent_first_coef = Entry(window, width=3)
  53.     ent_first_coef.place(x=1095, y=357)
  54.  
  55.     text = Label(window, text='*', font=('Arial', 13, 'bold'))
  56.     text.place(x=1120, y=357)
  57.  
  58.     functions = [
  59.                 'acos(x)', 'acosh(x)', 'asin(x)', 'asinh(x)', 'atan(x)', 'atan2(x,x)', 'atanh(x)', 'ceil(x)',
  60.                 'cos(x)', 'cosh(x)', 'exp(x)', 'expm1(x)', 'fabs(x)', 'factorial(x)', 'log(x)', 'log10(x)',
  61.                 'log1p(x)', 'log2(x)','sin(x)','sinh(x)', 'sqrt(x)', 'tan(x)', 'tanh(x)', 'tau(x)', 'trunc(x)'
  62.                 ]
  63.  
  64.     func_choose = ttk.Combobox(window, values=functions, width=20)
  65.     func_choose.place(x=1140, y=356)
  66.  
  67.     text = Label(window, text='+', font=('Arial', 13))
  68.     text.place(x=1290, y=354)
  69.  
  70.     ent_second_coef = Entry(window, width=3)
  71.     ent_second_coef.place(x=1310, y=356)
  72.  
  73.     global color
  74.     color = '#000000'
  75.     global but_color
  76.     but_color = Button(window, command=get_color, width=2, height=1, bg=color)
  77.     but_color.place(x=1300, y=380)
  78.  
  79.     # but_scale1 = Button(window, command=scale_up, text='up')
  80.     # but_scale1.place(x=1300, y=500)
  81.  
  82.     # but_scale2 = Button(window, command=scale_down, text='down')
  83.     # but_scale2.place(x=1300, y=600)
  84.  
  85.     global scale, graphic_scale
  86.     graphic_scale = 1
  87.     scale = 1
  88.     #BINDINGS
  89.     window.bind('<Return>', enter_function)
  90.     window.bind('<MouseWheel>', mouse_wheel)
  91.  
  92. def mouse_wheel(event):
  93.     global scale, graphic_scale
  94.     # -120 down, 120 up
  95.     if event.delta == 120:
  96.         graphic_scale *= 2
  97.     elif event.delta == -120 and scale >= -1:
  98.         graphic_scale /= 2
  99.  
  100.     if event.delta == 120:
  101.         canvas.scale('all', 512, 360, 2, 2)
  102.     elif event.delta == -120:
  103.         canvas.scale('all', 512, 360, 0.5, 0.5)
  104.  
  105.  
  106. def create_graphic_grid(delay, size=(1024, 720)):
  107.  
  108.     width = size[0]
  109.     height = size[1]
  110.  
  111.     middle_cord_x = (width)//2
  112.     middle_cord_y = (height)//2
  113.  
  114.     # Созадние осей графика
  115.     canvas.create_line(middle_cord_x, height, middle_cord_x, 0, width=3, arrow=LAST)
  116.     canvas.create_line(0, middle_cord_y, width, middle_cord_y, width=3, arrow=LAST)
  117.  
  118.     start_x = middle_cord_x % delay
  119.     start_y = middle_cord_y % delay
  120.  
  121.     # Создание сетки графика, меток и цифр
  122.     for i in range(start_x, width, delay):
  123.         canvas.create_line(i, 0, i, height, fill='grey')                        # Создание линий сетки по оси OY
  124.         canvas.create_line(i, middle_cord_y-5, i, middle_cord_y+6, width=3)     # Создание меток (разделителей на оси OX)
  125.         text = (middle_cord_x - i) // delay
  126.         canvas.create_text(i-5, middle_cord_y+10, text=-text, fill='#f10', font=('Arial', 8, 'bold')) # Создание цифр на разделителях оси OX
  127.  
  128.     for i in range(start_y, height, delay):
  129.         canvas.create_line(0, i, width, i, fill='grey')                         # Создание линий сетки по оси OX
  130.         canvas.create_line(middle_cord_x-5, i, middle_cord_x+6, i, width=3)     # Создание меток (разделителей на оси OY)
  131.         text = (middle_cord_y - i) // delay
  132.         if text == 0:
  133.             continue
  134.         canvas.create_text(middle_cord_x-10, i, text=text, fill='#f10', font=('Arial', 8, 'bold'))    # Создание цифр на разделителях оси OY
  135.  
  136.  
  137.     global params
  138.     params = (middle_cord_x, middle_cord_y, delay)
  139.  
  140.  
  141. def get_color():
  142.     global color
  143.     color = colorchooser.askcolor()[1]
  144.     but_color.config(bg=color)
  145.  
  146.  
  147. def enter_function(event):
  148.     get_choosen_graphic_n_draw()
  149.  
  150.  
  151. def get_choosen_graphic_n_draw():
  152.     body_func = func_choose.get()
  153.     first_coef = ent_first_coef.get()
  154.     second_coef = ent_second_coef.get()
  155.  
  156.     if first_coef != '':
  157.         first_coef += ' * '
  158.  
  159.     if second_coef != '':
  160.         if '-' not in second_coef:
  161.             second_coef = ' + ' + second_coef
  162.         else:
  163.             second_coef = ' - ' + second_coef[1:]
  164.  
  165.     func = Graphic(first_coef + body_func + second_coef)
  166.  
  167.     if func.function in graphs:
  168.         return
  169.  
  170.     functions.append(func)
  171.     graphs.append(func.function)
  172.     draw_graphic(func)  # params = (middle_cord_x, middle_cord_y, delay)
  173.     update_listbox('ADD')
  174.  
  175.  
  176. def hideshow_graphic():
  177.     selection = func_listbox.curselection()
  178.     for index in selection:
  179.         func = functions[index]
  180.  
  181.         if func.hided == True:
  182.             show_graphic(func, index)
  183.         else:
  184.             hide_graphic(func, index)
  185.  
  186.  
  187. # Скрывает график удаляя линии рисунка
  188. def hide_graphic(func, index):
  189.     '''
  190.    args - func (Grpahic), index (Int)
  191.    return - None
  192.    '''
  193.     func.hided = True
  194.     delete_graphic_lines(func)
  195.     graphics.pop(func)
  196.     func_listbox.delete(index)
  197.     func_listbox.insert(index,' y = ' + func.function + ' СКРЫТ')
  198.  
  199.  
  200. # Перерисовывает скрытый график
  201. def show_graphic(func, index):
  202.     '''
  203.    args - func (Grpahic), index (Int)
  204.    return - None
  205.    '''
  206.     func.hided = False
  207.     draw_graphic(func)
  208.     func_listbox.delete(index)
  209.     func_listbox.insert(index,' y = ' + func.function)
  210.  
  211.  
  212. def delete_graphic_lines(func):
  213.     '''
  214.    args - func (Grpahic)
  215.    return - None
  216.    '''
  217.     for line in graphics[func]:
  218.         canvas.delete(line)
  219.  
  220.  
  221. # Стерает выбранный график или последний, если график не выбран
  222. def erase_graphic():
  223.     global functions
  224.     selection = func_listbox.curselection()
  225.  
  226.     if len(selection) == 0:
  227.         func = functions[-1]
  228.         functions.pop()
  229.         graphs.pop()
  230.         index_func = len(functions)
  231.         delete_graphic_lines(func)
  232.         if not func.hided:
  233.             graphics.pop(func)
  234.         update_listbox('DELETEFUNC', index_func)
  235.  
  236.     else:
  237.         deleted_index = []
  238.         for i in sorted(list(selection), reverse=True):
  239.             index_func = i
  240.             func = functions[i]
  241.  
  242.             if func.hided:
  243.                 functions.remove(func)
  244.                 graphs.remove(func.function)
  245.                 deleted_index.append(index_func)
  246.             else:
  247.                 functions.remove(func)
  248.                 graphs.remove(func.function)
  249.                 delete_graphic_lines(func)
  250.                 graphics.pop(func)
  251.                 deleted_index.append(index_func)
  252.  
  253.         deleted_index.sort(reverse=True)
  254.         for i in deleted_index:
  255.             update_listbox('DELETEFUNC', i)
  256.  
  257.  
  258. # Удаляет все графики, а также очищает массивы
  259. def erase_graphics():
  260.     global graphics, functions, graphs
  261.  
  262.     for function in graphics:
  263.         delete_graphic_lines(function)
  264.  
  265.     graphs = []
  266.     functions = []
  267.     graphics = {}
  268.     update_listbox('DELETEALL')
  269.  
  270.  
  271. def draw_graphic(func):
  272.     global color
  273.     '''
  274.    Рисует график по точкам
  275.    args - func (Grpahic)
  276.    return - None
  277.    '''
  278.     graphic = []
  279.     x_dots = func.dots[0]
  280.     y_dots = func.dots[1]
  281.     for i in range(1, len(x_dots)-1):
  282.         try:
  283.             if x_dots[i] != None and x_dots[i-1] != None:
  284.                 last_x, last_y = set_coordinat(x_dots[i-1], y_dots[i-1], *params)
  285.                 x, y = set_coordinat(x_dots[i], y_dots[i], *params)
  286.                 graphic.append(canvas.create_line(last_x, last_y, x, y, fill=color, width=3))
  287.         except Exception:
  288.             continue
  289.     graphics[func] = graphic
  290.  
  291.  
  292. def set_coordinat(x, y, middle_cord_x, middle_cord_y, delay):
  293.     '''
  294.    Устанавливает координаты точки на графике
  295.    args - x (int), y (int), middle_cord_x (int), middle_cord_y (int), delay(int)
  296.    return - x (int), y (int)
  297.    '''
  298.     x = middle_cord_x + x*delay*graphic_scale
  299.     y = middle_cord_y - y*delay*graphic_scale
  300.     return x, y
  301.  
  302.  
  303. def update_listbox(action, index=None):
  304.     '''
  305.    args - action (str), index (int)
  306.    return - None
  307.    '''
  308.     # Удаляет все графики
  309.     if action == 'DELETEALL':
  310.         func_listbox.delete(0, func_listbox.size())
  311.     # Удаляет выбранный график
  312.     elif action == 'DELETEFUNC':
  313.         func_listbox.delete(index)
  314.     # Добавляет графиик
  315.     elif action == 'ADD':
  316.         func_listbox.insert(len(functions)-1, ' y = ' + functions[-1].function)
  317.  
  318.  
  319. def main():
  320.     global graphics, functions, graphs
  321.     graphics = {}
  322.     functions = []
  323.     graphs = []
  324.  
  325.     size_of_window = (1400, 900)
  326.     root = Tk()
  327.     start = (10, 10)
  328.     initialize_window(root, 'Graphics', size_of_window)
  329.     initialize_widgets(root, start)
  330.  
  331.     delay = 40
  332.     create_graphic_grid(delay)
  333.     root.mainloop()
  334.  
  335.  
  336. if __name__ == "__main__":
  337.     main()
  338.  
  339. # made by Egor Golubev Lyceum №8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement