def __init__(self, parent, db): Frame.__init__(self) # Создание основных переменных self.db = db self.parent = parent self.loggined = False self.user = None # Создание основного фрейма self.auth = Frame() # Название self.label = Label(self.auth, text='Авторизация', font=("Courier", 44)) self.label.pack() # Логин и пароль self.Login = StringVar() self.Password = StringVar() # Поле ввода для логина и пароля self.login = EntryWithPlaceholder(self.auth, 'Логин', textvariable=self.Login, font=("Courier", 44)) self.login.pack() self.password = EntryWithPlaceholder(self.auth, 'Пароль', hideChar=True, textvariable=self.Password, font=("Courier", 44)) self.password.pack(pady=15) # Кнопка подтверждения self.submit = HoverButton(self.auth, text='Подтвердить', font=("Courier", 44), command=self.check, activebackground='#00ff00') self.submit.pack(pady=(0, 15)) # Кнопка для регистрации self.reg = HoverButton(self.auth, text="Зарегистрироваться", font=("Courier", 26), command=self.register, activebackground='#00ff00') self.reg.pack() # Изменение цвета self.label['bg'] = '#00ace6' for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.auth.pack(pady=150)
def __init__(self, parent, db): # Задание основных переменных self.parent = parent self.db = db # Поле и скролл для таблицы self.text = Text(self.parent, wrap="none") self.vsb = Scrollbar(self.parent, orient="vertical", command=self.text.yview) # Кнопка возврата назад self.back = HoverButton(self.parent, font=("Courier", 18), text='Назад', activebackground='#00ff00', command=self.returnBack) self.back.pack(anchor=NW, padx=20, pady=20) # Основной фрейм self.mainPart = Frame(self.parent) # Переменная с логическим выражением self.inputInformation = StringVar() # Поле для ввода выражения self.inputField = EntryWithPlaceholder( self.mainPart, 'Логическое выражение', textvariable=self.inputInformation, font=('Courier', 40), width=30) # Кнопка для построения таблицы истинности self.submit = HoverButton(self.mainPart, font=('Courier', 30), text='Построить', activebackground='#00ff00', command=self.buildTable) # Вывод поля и фрейма self.inputField.grid(row=0, column=0, columnspan=3, padx=25) self.submit.grid(row=0, column=4) self.mainPart.pack() # Изменение парметров окна self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) # Изменение цвета приложения for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.parent["bg"] = '#00ace6' self.back["bg"] = "#e0e0e0"
def __init__(self, parent, db): self.parent = parent self.parent.title("Регистрация") self.db = db self.reg = Frame(self.parent) self.label = Label(self.reg, text='Регистрация', font=("Courier", 44)) self.label.pack() self.label['bg'] = '#00ace6' self.Login = StringVar() self.Password = StringVar() self.login = EntryWithPlaceholder(self.reg, 'Логин', font=("Courier", 44), textvariable=self.Login) self.login.pack() self.password = EntryWithPlaceholder( self.reg, 'Пароль', font=("Courier", 44), hideChar=True, textvariable=self.Password, ) self.password.pack(pady=15) self.submit = HoverButton(self.reg, text='Подтвердить', font=("Courier", 44), command=lambda: self.addToDb( self.login.get(), self.password.get()), activebackground='#00ff00') self.submit.pack() self.parent['bg'] = '#00ace6' self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.reg.pack(pady=150)
class Registr(Frame): def __init__(self, parent, db): self.parent = parent self.parent.title("Регистрация") self.db = db self.reg = Frame(self.parent) self.label = Label(self.reg, text='Регистрация', font=("Courier", 44)) self.label.pack() self.label['bg'] = '#00ace6' self.Login = StringVar() self.Password = StringVar() self.login = EntryWithPlaceholder(self.reg, 'Логин', font=("Courier", 44), textvariable=self.Login) self.login.pack() self.password = EntryWithPlaceholder( self.reg, 'Пароль', font=("Courier", 44), hideChar=True, textvariable=self.Password, ) self.password.pack(pady=15) self.submit = HoverButton(self.reg, text='Подтвердить', font=("Courier", 44), command=lambda: self.addToDb( self.login.get(), self.password.get()), activebackground='#00ff00') self.submit.pack() self.parent['bg'] = '#00ace6' self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.reg.pack(pady=150) # Добавление в базу данных и проверха возможности добавления def addToDb(self, login, password): # Проверка что такого пользователя не существует if self.db.checkUserLogin(login): messagebox.showerror("Регистрация", "Пользователь уже существует") self.parent.attributes('-topmost', True) self.parent.update() else: # Создание записи self.parent.attributes('-topmost', True) self.parent.update() self.parent.destroy() self.db.insertData(login, password) messagebox.showinfo( "Регистрация", "Пользователь успешно зарегистрирован", )
class TruthDiagram(Frame): def __init__(self, parent, db): # Задание основных переменных self.parent = parent self.db = db # Поле и скролл для таблицы self.text = Text(self.parent, wrap="none") self.vsb = Scrollbar(self.parent, orient="vertical", command=self.text.yview) # Кнопка возврата назад self.back = HoverButton(self.parent, font=("Courier", 18), text='Назад', activebackground='#00ff00', command=self.returnBack) self.back.pack(anchor=NW, padx=20, pady=20) # Основной фрейм self.mainPart = Frame(self.parent) # Переменная с логическим выражением self.inputInformation = StringVar() # Поле для ввода выражения self.inputField = EntryWithPlaceholder( self.mainPart, 'Логическое выражение', textvariable=self.inputInformation, font=('Courier', 40), width=30) # Кнопка для построения таблицы истинности self.submit = HoverButton(self.mainPart, font=('Courier', 30), text='Построить', activebackground='#00ff00', command=self.buildTable) # Вывод поля и фрейма self.inputField.grid(row=0, column=0, columnspan=3, padx=25) self.submit.grid(row=0, column=4) self.mainPart.pack() # Изменение парметров окна self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) # Изменение цвета приложения for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.parent["bg"] = '#00ace6' self.back["bg"] = "#e0e0e0" # Возврат назад def returnBack(self): self.parent.destroy() # Создание таблицы истинности def buildTable(self): # Попытка выполнить программу try: # Получение всех переменных из выражения variables = set() s = '' line = self.inputInformation.get() for i in line: if i == '+' or i == '*' or i == '!': if s: variables.add(s) s = '' elif i == '(' or i == ')': if s: variables.add(s) s = '' else: s += i variables.add(s) variables = sorted(list(variables)) # Текстовое поле со скроллом self.createText() # Вывод переменных for i in variables: label = Label(self.parent, text="%s \t" % i, font=("Courier", 20), borderwidth=2, relief="groove") self.text.window_create("end", window=label) label = Label(self.parent, text="Res \t", font=("Courier", 20), borderwidth=2, relief="groove") self.text.window_create("end", window=label) self.text.insert("end", "\n") # Заполнение таблицы for i in range(2**len(variables)): t = 2**(len(variables) - 1) val = [] s = line # Заполнение таблицы 1 и 0 while t > 0: if (i // t) % 2 == 0: label = Label(self.parent, text="0\t", font=("Courier", 20), borderwidth=2, relief="groove") val.append(0) else: label = Label(self.parent, text="1\t", font=("Courier", 20), borderwidth=2, relief="groove") val.append(1) self.text.window_create("end", window=label) t //= 2 # Вычисление значения каждой строки s = line # Замена цифр на булевы функции for i in range(len(variables)): if val[i]: s = s.replace(variables[i], 'True') else: s = s.replace(variables[i], 'False') # Вычисление значений в скобках while '(' in s: a = s.index('(') b = s.index(')') t = eval(s[a:b + 1]) if t: s = s.replace(s[a:b + 1], 'True') else: s = s.replace(s[a:b + 1], 'False') # Замена обратных булевых функций s = s.replace('!True', 'False') s = s.replace('!False', 'True') # Выполнение строчки и вывод результата if eval(s): label = Label(self.parent, text="1\t", font=("Courier", 20), borderwidth=2, relief="groove") else: label = Label(self.parent, text="0\t", font=("Courier", 20), borderwidth=2, relief="groove") # Вывод строчки self.text.window_create("end", window=label) # Перенос строки self.text.insert("end", "\n") self.text.configure(state="disabled") # В случае ошибки except Exception: # Текстовое поле со скроллом self.createText() label = Label(self.parent, text='Введите корректное выражение', font=("Courier", 20)) self.text.window_create("end", window=label) # Метод для создания поля для таблицы def createText(self): self.text.destroy() self.vsb.destroy() self.text = Text(self.parent, wrap="none") self.vsb = Scrollbar(self.parent, orient="vertical", command=self.text.yview) self.text.configure(yscrollcommand=self.vsb.set) self.vsb.pack(side="right", fill="y") self.text.pack(fill="both", expand=True)
def __init__(self, parent, db): # Объявление переменных self.parent = parent self.db = db self.font30 = ("Courier", 30) self.font20 = ("Courier", 20) # Основной фрейм self.mainPart = Frame(self.parent) # Переменные для ввода данных self.inputSystem = StringVar() self.inputValue = StringVar() self.outputSystem = StringVar() # Кнопка возврата назад self.back = HoverButton(self.parent, font=("Courier", 18), text='Назад', activebackground='#00ff00', command=self.returnBack) self.back.pack(anchor=NW, padx=20, pady=20) # Поле информации self.inputInformation = Label( self.mainPart, text="Число для перевода и его \n система счисления", font=self.font30) self.inputInformation["bg"] = '#00ace6' # Поле ответа self.outputInformation = Label(self.mainPart, text="Результат перевода", font=self.font30) self.outputInformation["bg"] = '#00ace6' # Место для ответа self.result = Label(self.mainPart, text='Здесь будет результат', font=self.font30) self.result["bg"] = '#00ace6' # Ввод исходной системы счисления self.inputNumeralSystem = EntryWithPlaceholder( self.mainPart, 'Система счисления исходного числа (2-36)', textvariable=self.inputSystem, font=self.font20, width=40) # Ввод исходного числа self.inputNumber = EntryWithPlaceholder(self.mainPart, 'Исходное число', textvariable=self.inputValue, font=self.font20, width=40) # Ввод выходной системы счисления self.outputNumeralSystem = EntryWithPlaceholder( self.mainPart, 'Система счисления выходного числа (2-36)', textvariable=self.outputSystem, font=self.font20, width=40) # Кнопка для перевода self.submit = HoverButton(self.mainPart, font=self.font20, text='Перевести', activebackground='#00ff00', command=self.translate) # Растановка виджетов на экране self.inputInformation.grid(row=0, column=0, padx=(0, 120), pady=(100, 0)) self.outputInformation.grid(row=0, column=1, pady=(100, 0)) self.inputNumeralSystem.grid(row=1, column=0, ipady=20, padx=(0, 120), pady=(20, 30)) self.outputNumeralSystem.grid(row=3, column=0, ipady=20, padx=(0, 120), pady=30) self.submit.grid(row=4, column=0, padx=(0, 100)) self.inputNumber.grid(row=2, column=0, ipady=20, padx=(0, 120)) self.result.grid(row=1, column=1, rowspan=3) self.mainPart.pack() # Изменение парметров окна self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) # Изменение цвета приложения for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.parent["bg"] = '#00ace6' self.back["bg"] = "#e0e0e0"
class CalculatorSystemDigit(Frame): def __init__(self, parent, db): # Объявление переменных self.parent = parent self.db = db self.font30 = ("Courier", 30) self.font20 = ("Courier", 20) # Основной фрейм self.mainPart = Frame(self.parent) # Переменные для ввода данных self.inputSystem = StringVar() self.inputValue = StringVar() self.outputSystem = StringVar() # Кнопка возврата назад self.back = HoverButton(self.parent, font=("Courier", 18), text='Назад', activebackground='#00ff00', command=self.returnBack) self.back.pack(anchor=NW, padx=20, pady=20) # Поле информации self.inputInformation = Label( self.mainPart, text="Число для перевода и его \n система счисления", font=self.font30) self.inputInformation["bg"] = '#00ace6' # Поле ответа self.outputInformation = Label(self.mainPart, text="Результат перевода", font=self.font30) self.outputInformation["bg"] = '#00ace6' # Место для ответа self.result = Label(self.mainPart, text='Здесь будет результат', font=self.font30) self.result["bg"] = '#00ace6' # Ввод исходной системы счисления self.inputNumeralSystem = EntryWithPlaceholder( self.mainPart, 'Система счисления исходного числа (2-36)', textvariable=self.inputSystem, font=self.font20, width=40) # Ввод исходного числа self.inputNumber = EntryWithPlaceholder(self.mainPart, 'Исходное число', textvariable=self.inputValue, font=self.font20, width=40) # Ввод выходной системы счисления self.outputNumeralSystem = EntryWithPlaceholder( self.mainPart, 'Система счисления выходного числа (2-36)', textvariable=self.outputSystem, font=self.font20, width=40) # Кнопка для перевода self.submit = HoverButton(self.mainPart, font=self.font20, text='Перевести', activebackground='#00ff00', command=self.translate) # Растановка виджетов на экране self.inputInformation.grid(row=0, column=0, padx=(0, 120), pady=(100, 0)) self.outputInformation.grid(row=0, column=1, pady=(100, 0)) self.inputNumeralSystem.grid(row=1, column=0, ipady=20, padx=(0, 120), pady=(20, 30)) self.outputNumeralSystem.grid(row=3, column=0, ipady=20, padx=(0, 120), pady=30) self.submit.grid(row=4, column=0, padx=(0, 100)) self.inputNumber.grid(row=2, column=0, ipady=20, padx=(0, 120)) self.result.grid(row=1, column=1, rowspan=3) self.mainPart.pack() # Изменение парметров окна self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) # Изменение цвета приложения for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.parent["bg"] = '#00ace6' self.back["bg"] = "#e0e0e0" # Возврат назад def returnBack(self): self.parent.destroy() # Перевод в другую систему счисления def translate(self): # Проверка валидности входной системы счисления if self.checkSystem(self.inputSystem.get(), self.result, 'исходной'): from_base = int(self.inputSystem.get()) else: return num = self.inputValue.get() # Проверка валдиности исходного числа alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" if any([True for i in num if i not in alphabet]): self.result['text'] = 'Введите корректное число' elif any([True for i in num if alphabet.index(i) >= from_base]): self.result['text'] = 'Введите корректное число' # Проверка валидности выходной системы счисления if self.checkSystem(self.outputSystem.get(), self.result, 'выходной'): to_base = int(self.outputSystem.get()) else: return # Перевод к десятичному числу n = int(num, from_base) if isinstance(num, str) else num # Перевод в новую систему счисления res = "" while n > 0: n, m = divmod(n, to_base) res += alphabet[m] # Запись результата s = '' res = res[::-1] for i in range(len(res)): if i % 30 == 0: s += '\n' s += res[i] self.result['text'] = s # Метод для проверки валидности числа def checkSystem(self, systemToCheck, label, errorText): s = 'Введите число\nот 2 до 36 в {}\nсистеме счисления'.format( errorText) # Если не число, то запись ошибку и вернуть ошибку if not systemToCheck.isdigit(): label['text'] = s return False # Проверка что число от 2 до 36 if int(systemToCheck) > 36 or int(systemToCheck) < 2: label['text'] = s return False # Если переводится в число и оно от 2 до 36 return True
class Authentication(Frame): def __init__(self, parent, db): Frame.__init__(self) # Создание основных переменных self.db = db self.parent = parent self.loggined = False self.user = None # Создание основного фрейма self.auth = Frame() # Название self.label = Label(self.auth, text='Авторизация', font=("Courier", 44)) self.label.pack() # Логин и пароль self.Login = StringVar() self.Password = StringVar() # Поле ввода для логина и пароля self.login = EntryWithPlaceholder(self.auth, 'Логин', textvariable=self.Login, font=("Courier", 44)) self.login.pack() self.password = EntryWithPlaceholder(self.auth, 'Пароль', hideChar=True, textvariable=self.Password, font=("Courier", 44)) self.password.pack(pady=15) # Кнопка подтверждения self.submit = HoverButton(self.auth, text='Подтвердить', font=("Courier", 44), command=self.check, activebackground='#00ff00') self.submit.pack(pady=(0, 15)) # Кнопка для регистрации self.reg = HoverButton(self.auth, text="Зарегистрироваться", font=("Courier", 26), command=self.register, activebackground='#00ff00') self.reg.pack() # Изменение цвета self.label['bg'] = '#00ace6' for wid in self.parent.winfo_children(): wid.configure(bg='#00ace6') self.auth.pack(pady=150) # Проверка введенного логина и пароля def check(self): self.loggined, self.User = self.db.checkUser(self.Login.get(), self.Password.get()) if self.loggined: self.parent.destroy() self.parent = Tk() self.app = App(self.parent, self.db) self.parent.resizable(width=False, height=False) self.parent.attributes('-fullscreen', True) self.parent.mainloop() else: messagebox.showerror("Авторизация", "Неверный логин или пароль") # Создание окна регистрации def register(self): self.newWindow = Toplevel(self.parent) self.app = Registr(self.newWindow, self.db)