Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- alphabetfor10 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
- alphabetfor5 = ['0', '1', '2', '3', '4']
- max_10_num = 95367431640624
- max_len_num = 20
- max_5_num = 232023300444444444
- def show_buttons(): # Показывает кнопки начальной вкладки
- btncalc.grid(padx = 10, pady = 10, row=0, column=0, sticky='w')
- entry.grid(pady = 10, row=0, column=1, sticky = 'w')
- entry2.grid(row=1, column=1, sticky = 'w')
- if choice.get() == 0:
- label_ten.place(x = 220, y = 10)
- label_five.place(x=220, y = 45)
- else:
- label_five.place(x=220, y=10)
- label_ten.place(x=220, y=45)
- from10to5.grid(row=2, column=1)
- from5to10.grid(row=3, column=1)
- btn7.grid(row=2, column=0, sticky='w', ipadx=10, ipady=10)
- btn8.grid(row=2, column=1, sticky='w', ipadx=10, ipady=10)
- btn9.grid(row=2, column=2, sticky='w', ipadx=10, ipady=10)
- btn4.grid(row=3, column=0, sticky='w', ipadx=10, ipady=10)
- btn5.grid(row=3, column=1, sticky='w', ipadx=10, ipady=10)
- btn6.grid(row=3, column=2, sticky='w', ipadx=10, ipady=10)
- btn1.grid(row=4, column=0, sticky='w', ipadx=10, ipady=10)
- btn2.grid(row=4, column=1, sticky='w', ipadx=10, ipady=10)
- btn3.grid(row=4, column=2, sticky='w', ipadx=10, ipady=10)
- btnm.grid(row=5, column=0, sticky='w', ipadx=10, ipady=10)
- btn0.grid(row=5, column=1, sticky='w', ipadx=10, ipady=10)
- btndot.grid(row=5, column=2, sticky='w', ipadx=11, ipady=10)
- def swap():
- entry2.config(state = NORMAL)
- entry.delete(0, END)
- entry2.delete(0, END)
- entry2.config(state = DISABLED)
- if choice.get() == 0:
- label_ten.place(x = 220, y = 10)
- label_five.place(x=220, y = 45)
- else:
- label_five.place(x=220, y=10)
- label_ten.place(x=220, y=45)
- def checkChoice(event): # Проверяем в какую систему из какой переводить
- try:
- if len(entry.get()) > 20:
- entry.delete(0, END)
- entry.insert(0, 'number too long')
- else:
- if choice.get() == 0:
- if float(entry.get()) > max_10_num:
- entry.delete(0, END)
- entry.insert(0, 'number too big')
- else: f10to5()
- else:
- if float(entry.get()) > max_5_num:
- entry.delete(0, END)
- entry.insert(0, 'number too big')
- else: f5to10()
- except ValueError:
- entry.delete(0, END)
- entry.insert(0, 'Некорректный ввод')
- def fieldRemove(): # Удаляем последний написанный символ
- field = entry.get()
- entry.delete(0, END)
- entry.insert(0, field[0:-1])
- def checkEntry(event): # Проверяем правильность введёного символа
- symbol = event.char
- print(entry.get())
- if (len(symbol) != 0 and ord(symbol) != 13):
- if (entry.get()[0:14] == 'number too big'): entry.delete(0, 14)
- elif (entry.get()[0:15] == 'number too long'): entry.delete(0, 15)
- elif (entry.get()[0:17] == 'Некорректный ввод'): entry.delete(0, 17)
- #print(ord(symbol))
- if symbol == '': pass
- elif len(symbol) != 0 and ord(symbol) == 13: pass
- elif (symbol == '-' and len(entry.get()) != 1): fieldRemove()
- elif len(entry.get()) == 1 and (symbol == '0' or symbol == '.'): fieldRemove()
- elif symbol == '.' and '.' in entry.get()[0: -1]: fieldRemove()
- elif (choice.get() == 0 and ((symbol not in (alphabetfor10))
- and symbol != '-' and symbol != '.')): fieldRemove()
- elif (choice.get() == 1 and ((symbol not in (alphabetfor5))
- and symbol != '-' and symbol != '.')): fieldRemove()
- def clear(): # Очищаем поле ввода
- entry.delete(0, END)
- entry2.delete(0, END)
- def btnprint(value): # Функция для печати кнопок с окна
- if (entry.get()[0:14] == 'number too big'):
- entry.delete(0, 14)
- elif (entry.get()[0:15] == 'number too long'):
- entry.delete(0, 15)
- elif (entry.get()[0:17] == 'Некорректный ввод'):
- entry.delete(0, 17)
- if (entry.get() == 'number too big' or
- entry.get() == 'number too long' or
- entry.get() == 'Некорректный ввод'): entry.delete(0, END)
- if ((value == '-' and len(entry.get()) != 0)
- or (len(entry.get()) == 0 and (value == '0' or value == '.'))
- or (value == '.' and '.' in entry.get())): pass
- else:
- entry.insert(END, str(value))
- def prog(): # Переключение на начальный экран
- label_about.grid_forget()
- show_buttons()
- def about(): # Переключение на экран "Информация"
- entry2.grid_forget()
- btncalc.grid_forget()
- entry.grid_forget()
- label_ten.place_forget()
- label_five.place_forget()
- from10to5.grid_forget()
- from5to10.grid_forget()
- btn7.grid_forget()
- btn8.grid_forget()
- btn9.grid_forget()
- btn4.grid_forget()
- btn5.grid_forget()
- btn6.grid_forget()
- btn1.grid_forget()
- btn2.grid_forget()
- btn3.grid_forget()
- btn0.grid_forget()
- btnm.grid_forget()
- btndot.grid_forget()
- label_about.grid(row = 0, column = 0, pady = 130, padx = 35)
- def f10to5(): # Перевод из 10 в 5 с.с.
- num = entry.get()
- have_num = False
- if num == '': return
- #entry.delete(0, END)
- dot = False
- negative = False
- for i in range(len(num)):
- if num[i] not in alphabetfor10:
- if i == 0 and num[i] == '-' and len(num) != 1:
- negative = True
- elif dot == False and num[i] == '.' and i != 0 and len(num) != 1:
- dot = True
- else:
- entry.insert(0, 'Некорректный ввод')
- return
- else:
- if dot == True and have_num == False:
- entry.insert(0, 'Некорректный ввод')
- return
- else: have_num = True
- if negative and dot and len(num) == 2:
- entry.insert(0, 'Некорректный ввод')
- return
- num = num.split('.')
- if negative: num[0] = num[0][1:]
- intgr10 = int(num[0]) # Целая часть десятичная числа
- remainder10 = [] # Остатки от деления десятичного числа на 5
- while intgr10 > 5:
- remainder10.append(str(intgr10%5))
- intgr10 //= 5
- remainder10.append(str(intgr10))
- intpart = '' # Целая часть пятиричного числа
- remainder10.reverse() # Остатки записываем в обратном порядке !!!
- for i in remainder10:
- intpart += i
- if dot:
- fract10 = float('0.' + str(num[1])) # Дробная часть 10 числа
- fract5 = [] # Целые части от умножения дробной части числа на 5
- for i in range(8):
- fract10 *= 5
- if fract10 > 0:
- fract5.append(str(int(fract10)))
- fract10 -= int(fract10)
- elif fract10 == 0:
- break
- fractpart = '' # Дробая часть пятиричного числа
- for i in fract5:
- fractpart += i
- intpart += '.' + fractpart
- if negative: intpart = '-' + intpart
- entry2.config(state=NORMAL)
- entry2.delete(0, END)
- entry2.insert(0, intpart)
- entry2.config(state=DISABLED)
- def f5to10(): # Перевод из 5 в 10 с.с.
- num = entry.get()
- if num == '': return
- #entry.delete(0, END)
- dot = False
- negative = False
- for i in range(len(num)):
- if num[i] not in alphabetfor5:
- if i == 0 and num[i] == '-' and len(num) != 1:
- negative = True
- elif dot == False and num[i] == '.' and i != 0 and len(num) != 1:
- dot = True
- else:
- entry.delete(0, END)
- entry.insert(0, 'Некорректный ввод')
- return
- num = num.split('.')
- if negative and dot and len(num[0]) == 1:
- entry.insert(0, 'Некорректный ввод')
- return
- numeral = 0 # Демятичное число, которое должно получится
- intgr5 = str(num[0]) # Целая часть пятиричного числа
- if negative: intgr5 = intgr5[1:]
- intgr5 = list(intgr5)
- intgr5.reverse()
- coeff = 1 # Коэффициент, на который необходимо умножить разряд для перевода
- for i in intgr5:
- numeral += int(i)*coeff
- coeff *= 5
- if dot:
- remainder5 = str(num[1]) # Дробная часть 5 числа
- coeff = 0.2
- for i in remainder5:
- numeral += int(i)*coeff
- coeff /= 5
- if negative: numeral = -numeral
- numeral = str(numeral)
- entry2.config(state=NORMAL)
- entry2.delete(0, END)
- entry2.insert(0, numeral)
- entry2.config(state=DISABLED)
- window = Tk()
- window.title('Calculator')
- window.geometry('320x350+0+0')
- #window.grid_columnconfigure(0, weight=1)
- frame = Frame(window)
- frame2 = Frame(window)
- mainMenu = Menu(window)
- window.config(menu=mainMenu)
- field = StringVar()
- entry = Entry(frame, textvariable = field)#, command = checkEntry)
- entry.bind("<Return>", checkChoice)
- entry.bind("<Any-KeyRelease>", checkEntry)
- entry2 = Entry(frame, state = 'readonly')
- label_ten = Label(text = 'Десятичная с.с.')
- label_five = Label(text = 'Пятиричная с.с.')
- label_about = Label(window, text='Данная программа была создана усилиями\n '
- 'Колосова Дениса Витальевича\n Студента кафедры ИУ-7 группы 22-Б\n МГТУ '
- 'им. Н.Э. Баумана', padx = 0, pady = 0)
- mainMenu.add_command(label = 'Программа', command = prog)
- mainMenu.add_command(label = 'Очистка поля ввода', command = clear)
- mainMenu.add_command(label = 'О программе', command = about)
- choice = IntVar()
- choice.set(0)
- from10to5 = Radiobutton(frame, text = 'Из десятичной в пятиричную', variable = choice, value = 0, command = swap)
- from5to10 = Radiobutton(frame, text = 'Из пятиричной в десятичную', variable = choice, value = 1, command = swap)
- btncalc = Button(frame, text = 'Перевести', command = lambda: checkChoice(0))
- btn1 = Button(frame2, text = '1', command = lambda: btnprint('1'))
- btn2 = Button(frame2, text = '2', command = lambda: btnprint('2'))
- btn3 = Button(frame2, text = '3', command = lambda: btnprint('3'))
- btn4 = Button(frame2, text = '4', command = lambda: btnprint('4'))
- btn5 = Button(frame2, text = '5', command = lambda: btnprint('5'))
- btn6 = Button(frame2, text = '6', command = lambda: btnprint('6'))
- btn7 = Button(frame2, text = '7', command = lambda: btnprint('7'))
- btn8 = Button(frame2, text = '8', command = lambda: btnprint('8'))
- btn9 = Button(frame2, text = '9', command = lambda: btnprint('9'))
- btn0 = Button(frame2, text = '0', command = lambda: btnprint('0'))
- btndot = Button(frame2, text = '.', command = lambda: btnprint('.'))
- btnm = Button(frame2, text = '-', command = lambda: btnprint('-'))
- show_buttons()
- frame.grid(sticky = 'w')
- frame2.grid(sticky = 'w', padx = 75)
- window.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement