Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.55 KB | None | 0 0
  1.  
  2.  
  3. from tkinter import *
  4.  
  5. alphabetfor10 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
  6. alphabetfor5 = ['0', '1', '2', '3', '4']
  7.  
  8. max_10_num = 95367431640624
  9. max_len_num = 20
  10. max_5_num = 232023300444444444
  11. def show_buttons():  # Показывает кнопки начальной вкладки
  12.  
  13.     btncalc.grid(padx = 10, pady = 10, row=0, column=0, sticky='w')
  14.     entry.grid(pady = 10, row=0, column=1, sticky = 'w')
  15.     entry2.grid(row=1, column=1, sticky = 'w')
  16.     if choice.get() == 0:
  17.         label_ten.place(x = 220, y = 10)
  18.         label_five.place(x=220, y = 45)
  19.     else:
  20.         label_five.place(x=220, y=10)
  21.         label_ten.place(x=220, y=45)
  22.     from10to5.grid(row=2, column=1)
  23.     from5to10.grid(row=3, column=1)
  24.     btn7.grid(row=2, column=0, sticky='w', ipadx=10, ipady=10)
  25.     btn8.grid(row=2, column=1, sticky='w', ipadx=10, ipady=10)
  26.     btn9.grid(row=2, column=2, sticky='w', ipadx=10, ipady=10)
  27.     btn4.grid(row=3, column=0, sticky='w', ipadx=10, ipady=10)
  28.     btn5.grid(row=3, column=1, sticky='w', ipadx=10, ipady=10)
  29.     btn6.grid(row=3, column=2, sticky='w', ipadx=10, ipady=10)
  30.     btn1.grid(row=4, column=0, sticky='w', ipadx=10, ipady=10)
  31.     btn2.grid(row=4, column=1, sticky='w', ipadx=10, ipady=10)
  32.     btn3.grid(row=4, column=2, sticky='w', ipadx=10, ipady=10)
  33.     btnm.grid(row=5, column=0, sticky='w', ipadx=10, ipady=10)
  34.     btn0.grid(row=5, column=1, sticky='w', ipadx=10, ipady=10)
  35.     btndot.grid(row=5, column=2, sticky='w', ipadx=11, ipady=10)
  36.  
  37. def swap():
  38.     entry2.config(state = NORMAL)
  39.     entry.delete(0, END)
  40.     entry2.delete(0, END)
  41.     entry2.config(state = DISABLED)
  42.     if choice.get() == 0:
  43.         label_ten.place(x = 220, y = 10)
  44.         label_five.place(x=220, y = 45)
  45.     else:
  46.         label_five.place(x=220, y=10)
  47.         label_ten.place(x=220, y=45)
  48.  
  49. def checkChoice(event):  # Проверяем в какую систему из какой переводить
  50.     try:
  51.         if len(entry.get()) > 20:
  52.             entry.delete(0, END)
  53.             entry.insert(0, 'number too long')
  54.         else:
  55.             if choice.get() == 0:
  56.                 if float(entry.get()) > max_10_num:
  57.                     entry.delete(0, END)
  58.                     entry.insert(0, 'number too big')
  59.                 else: f10to5()
  60.             else:
  61.                 if float(entry.get()) > max_5_num:
  62.                     entry.delete(0, END)
  63.                     entry.insert(0, 'number too big')
  64.                 else: f5to10()
  65.     except ValueError:
  66.         entry.delete(0, END)
  67.         entry.insert(0, 'Некорректный ввод')
  68.  
  69.  
  70. def fieldRemove():  # Удаляем последний написанный символ
  71.     field = entry.get()
  72.     entry.delete(0, END)
  73.     entry.insert(0, field[0:-1])
  74.  
  75.  
  76. def checkEntry(event):  # Проверяем правильность введёного символа
  77.     symbol = event.char
  78.     print(entry.get())
  79.     if (len(symbol) != 0 and ord(symbol) != 13):
  80.         if (entry.get()[0:14] == 'number too big'): entry.delete(0, 14)
  81.         elif (entry.get()[0:15] == 'number too long'): entry.delete(0, 15)
  82.         elif (entry.get()[0:17] == 'Некорректный ввод'): entry.delete(0, 17)
  83.     #print(ord(symbol))
  84.     if symbol == '': pass
  85.     elif len(symbol) != 0 and ord(symbol) == 13: pass
  86.     elif (symbol == '-' and len(entry.get()) != 1): fieldRemove()
  87.     elif len(entry.get()) == 1 and (symbol == '0' or symbol == '.'): fieldRemove()
  88.     elif symbol == '.' and '.' in entry.get()[0: -1]: fieldRemove()
  89.     elif (choice.get() == 0 and ((symbol not in (alphabetfor10))
  90.         and symbol != '-' and symbol != '.')): fieldRemove()
  91.     elif (choice.get() == 1 and ((symbol not in (alphabetfor5))
  92.         and symbol != '-' and symbol != '.')): fieldRemove()
  93.  
  94.  
  95.  
  96. def clear():  # Очищаем поле ввода
  97.     entry.delete(0, END)
  98.     entry2.delete(0, END)
  99.  
  100. def btnprint(value):  # Функция для печати кнопок с окна
  101.     if (entry.get()[0:14] == 'number too big'):
  102.         entry.delete(0, 14)
  103.     elif (entry.get()[0:15] == 'number too long'):
  104.         entry.delete(0, 15)
  105.     elif (entry.get()[0:17] == 'Некорректный ввод'):
  106.         entry.delete(0, 17)
  107.     if (entry.get() == 'number too big' or
  108.     entry.get() == 'number too long' or
  109.     entry.get() == 'Некорректный ввод'): entry.delete(0, END)
  110.     if ((value == '-' and len(entry.get()) != 0)
  111.     or (len(entry.get()) == 0 and (value == '0' or value == '.'))
  112.     or (value == '.' and '.' in entry.get())): pass
  113.     else:
  114.         entry.insert(END, str(value))
  115.  
  116. def prog():  # Переключение на начальный экран
  117.     label_about.grid_forget()
  118.     show_buttons()
  119.  
  120.  
  121. def about():  # Переключение на экран "Информация"
  122.     entry2.grid_forget()
  123.     btncalc.grid_forget()
  124.     entry.grid_forget()
  125.     label_ten.place_forget()
  126.     label_five.place_forget()
  127.     from10to5.grid_forget()
  128.     from5to10.grid_forget()
  129.     btn7.grid_forget()
  130.     btn8.grid_forget()
  131.     btn9.grid_forget()
  132.     btn4.grid_forget()
  133.     btn5.grid_forget()
  134.     btn6.grid_forget()
  135.     btn1.grid_forget()
  136.     btn2.grid_forget()
  137.     btn3.grid_forget()
  138.     btn0.grid_forget()
  139.     btnm.grid_forget()
  140.     btndot.grid_forget()
  141.  
  142.     label_about.grid(row = 0, column = 0, pady = 130, padx = 35)
  143.  
  144.  
  145.  
  146.  
  147.  
  148. def f10to5():  # Перевод из 10 в 5 с.с.
  149.     num = entry.get()
  150.     have_num = False
  151.     if num == '': return
  152.     #entry.delete(0, END)
  153.     dot = False
  154.     negative = False
  155.     for i in range(len(num)):
  156.         if num[i] not in alphabetfor10:
  157.             if i == 0 and num[i] == '-' and len(num) != 1:
  158.                 negative = True
  159.             elif dot == False and num[i] == '.' and i != 0 and len(num) != 1:
  160.                 dot = True
  161.             else:
  162.                 entry.insert(0, 'Некорректный ввод')
  163.                 return
  164.         else:
  165.             if dot == True and have_num == False:
  166.                 entry.insert(0, 'Некорректный ввод')
  167.                 return
  168.             else: have_num = True
  169.  
  170.     if negative and dot and len(num) == 2:
  171.         entry.insert(0, 'Некорректный ввод')
  172.         return
  173.     num = num.split('.')
  174.     if negative: num[0] = num[0][1:]
  175.     intgr10 = int(num[0])  # Целая часть десятичная числа
  176.     remainder10 = []  # Остатки от деления десятичного числа на 5
  177.     while intgr10 > 5:
  178.         remainder10.append(str(intgr10%5))
  179.         intgr10 //= 5
  180.     remainder10.append(str(intgr10))
  181.     intpart = ''  # Целая часть пятиричного числа
  182.     remainder10.reverse()  # Остатки записываем в обратном порядке !!!
  183.     for i in remainder10:
  184.         intpart += i
  185.  
  186.     if dot:
  187.         fract10 = float('0.' + str(num[1]))  # Дробная часть 10 числа
  188.         fract5 = []  # Целые части от умножения дробной части числа на 5
  189.         for i in range(8):
  190.             fract10 *= 5
  191.             if fract10 > 0:
  192.                 fract5.append(str(int(fract10)))
  193.                 fract10 -= int(fract10)
  194.             elif fract10 == 0:
  195.                 break
  196.         fractpart = ''  # Дробая часть пятиричного числа
  197.         for i in fract5:
  198.             fractpart += i
  199.  
  200.         intpart += '.' + fractpart
  201.  
  202.     if negative: intpart = '-' + intpart
  203.  
  204.     entry2.config(state=NORMAL)
  205.     entry2.delete(0, END)
  206.     entry2.insert(0, intpart)
  207.     entry2.config(state=DISABLED)
  208.  
  209.  
  210.  
  211. def f5to10():  # Перевод из 5 в 10 с.с.
  212.     num = entry.get()
  213.     if num == '': return
  214.     #entry.delete(0, END)
  215.     dot = False
  216.     negative = False
  217.     for i in range(len(num)):
  218.         if num[i] not in alphabetfor5:
  219.             if i == 0 and num[i] == '-' and len(num) != 1:
  220.                 negative = True
  221.             elif dot == False and num[i] == '.' and i != 0 and len(num) != 1:
  222.                 dot = True
  223.             else:
  224.                 entry.delete(0, END)
  225.                 entry.insert(0, 'Некорректный ввод')
  226.                 return
  227.     num = num.split('.')
  228.     if negative and dot and len(num[0]) == 1:
  229.         entry.insert(0, 'Некорректный ввод')
  230.         return
  231.     numeral = 0  # Демятичное число, которое должно получится
  232.     intgr5 = str(num[0])  # Целая часть пятиричного числа
  233.     if negative: intgr5 = intgr5[1:]
  234.     intgr5 = list(intgr5)
  235.     intgr5.reverse()
  236.     coeff = 1  # Коэффициент, на который необходимо умножить разряд для перевода
  237.     for i in intgr5:
  238.         numeral += int(i)*coeff
  239.         coeff *= 5
  240.     if dot:
  241.         remainder5 = str(num[1])  # Дробная часть 5 числа
  242.         coeff = 0.2
  243.         for i in remainder5:
  244.             numeral += int(i)*coeff
  245.             coeff /= 5
  246.  
  247.     if negative: numeral = -numeral
  248.     numeral = str(numeral)
  249.  
  250.     entry2.config(state=NORMAL)
  251.     entry2.delete(0, END)
  252.     entry2.insert(0, numeral)
  253.     entry2.config(state=DISABLED)
  254.  
  255.  
  256.  
  257.  
  258. window = Tk()
  259.  
  260. window.title('Calculator')
  261. window.geometry('320x350+0+0')
  262. #window.grid_columnconfigure(0, weight=1)
  263. frame = Frame(window)
  264. frame2 = Frame(window)
  265. mainMenu = Menu(window)
  266. window.config(menu=mainMenu)
  267. field = StringVar()
  268. entry = Entry(frame, textvariable = field)#, command = checkEntry)
  269. entry.bind("<Return>", checkChoice)
  270. entry.bind("<Any-KeyRelease>", checkEntry)
  271. entry2 = Entry(frame, state = 'readonly')
  272.  
  273. label_ten =  Label(text = 'Десятичная с.с.')
  274. label_five =  Label(text = 'Пятиричная с.с.')
  275. label_about = Label(window, text='Данная программа была создана усилиями\n '
  276.     'Колосова Дениса Витальевича\n Студента кафедры ИУ-7 группы 22-Б\n МГТУ '
  277.     'им. Н.Э. Баумана', padx = 0, pady = 0)
  278.  
  279. mainMenu.add_command(label = 'Программа', command = prog)
  280. mainMenu.add_command(label = 'Очистка поля ввода', command = clear)
  281. mainMenu.add_command(label = 'О программе', command = about)
  282. choice = IntVar()
  283. choice.set(0)
  284. from10to5 = Radiobutton(frame, text = 'Из десятичной в пятиричную', variable = choice, value = 0, command = swap)
  285. from5to10 = Radiobutton(frame, text = 'Из пятиричной в десятичную', variable = choice, value = 1, command = swap)
  286.  
  287.  
  288.  
  289. btncalc = Button(frame, text = 'Перевести', command = lambda: checkChoice(0))
  290. btn1 = Button(frame2, text = '1', command = lambda: btnprint('1'))
  291. btn2 = Button(frame2, text = '2', command = lambda: btnprint('2'))
  292. btn3 = Button(frame2, text = '3', command = lambda: btnprint('3'))
  293. btn4 = Button(frame2, text = '4', command = lambda: btnprint('4'))
  294. btn5 = Button(frame2, text = '5', command = lambda: btnprint('5'))
  295. btn6 = Button(frame2, text = '6', command = lambda: btnprint('6'))
  296. btn7 = Button(frame2, text = '7', command = lambda: btnprint('7'))
  297. btn8 = Button(frame2, text = '8', command = lambda: btnprint('8'))
  298. btn9 = Button(frame2, text = '9', command = lambda: btnprint('9'))
  299. btn0 = Button(frame2, text = '0', command = lambda: btnprint('0'))
  300. btndot = Button(frame2, text = '.', command = lambda: btnprint('.'))
  301. btnm = Button(frame2, text = '-', command = lambda: btnprint('-'))
  302.  
  303. show_buttons()
  304.  
  305. frame.grid(sticky = 'w')
  306. frame2.grid(sticky = 'w', padx = 75)
  307. window.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement