У меня есть пользовательская программа для входа / регистрации для проверки данных и базы данных SQLite3.У меня были все функции, работающие правильно в графическом интерфейсе Tkinter, то есть: я смог зарегистрировать нового пользователя и войти в систему, используя данные.Процесс регистрации создал базу данных SQLite, для которой была выполнена проверка входа в систему.
Все работало нормально, когда я просто использовал таблицу Users в качестве моей ссылки.
Затем я внес некоторые изменения в порядкечтобы очистить код и запустить код сверху вниз («Пуск» -> «Регистрация» -> «Вход в систему» -> «Успешный вход в систему» -> «Главное приложение») в последовательности, которая обычно выполняется.
Я сделал следующее:
1.Добавлена функция app_start, чтобы можно было уничтожить начальный главный экран.Запустите функцию app_start как mainloop () вместо функции main_screen.
Реструктурировал код в последовательности, которую он будет выполнять с точки зрения графического интерфейса.
Сделал дополнительные записи пользователя на «Странице регистрации» для дальнейшего сбора информации и создалновая таблица.
Код теперь создает пустые записи базы данных, и в результате функция входа в систему не работает.
import tkinter as tk
from tkinter import *
import os
import time
import datetime
import sqlite3
screensize = "500x500"
popsize = "150x150"
conn = sqlite3.connect('UserInfo.db')
c = conn.cursor()
def main_screen():
global screen
screen = Tk()
screen.geometry('300x200')
screen.title("Main Screen")
Label(text = "LOGIN PAGE", bg = "grey", width = "300", height = "2", font = ("Calibri", 12)).pack()
Label(text = "").pack()
Button(text = "Login", height = "2", width = "30", command = Login).pack()
Label(text = "").pack()
Button(text = "Register", height = "2", width = "30" , command = register).pack()
def register():
global screen1
screen1 = Tk()
screen1.title("Register")
screen1.geometry(screensize)
global username
global password
global Firstname
global Surname
global Registrationnumber
username = StringVar()
password = StringVar()
Firstname = StringVar()
Surname = StringVar()
Registrationnumber = StringVar()
Label(screen1, text = "Please enter details below", font = ("Calibiri", 20)).place(x = 10, y = 50)
Label(screen1, text = "")
Label(screen1,text = "First Name / Company name*").place(x = 10, y = 120)
global Firstname_entry
Firstname_entry = Entry(screen1, textvariable = Firstname)
Firstname_entry.place(x = 250, y = 120)
Label(screen1,text = "Surname*").place(x = 10, y = 155)
global Surname_entry
Surname_entry = Entry(screen1, textvariable = Surname)
Surname_entry.place(x = 250, y = 155)
Label(screen1,text = "Registration number*").place( x = 10, y = 185)
global Registrationnumber_entry
Registrationnumber_entry = Entry(screen1, textvariable = Registrationnumber)
Registrationnumber_entry.place(x = 250, y = 185)
Label(screen1,text = "Username *").place(x = 10, y = 220)
global username_entry
username_entry = Entry(screen1, textvariable = username)
username_entry.place(x = 250, y = 220)
Label(screen1,text = "Password*").place(x = 10, y = 255)
global password_entry
password_entry = Entry(screen1, textvariable = password)
password_entry.place(x = 250, y = 255)
Button(screen1, text = "Register user now", command = register_user).place(x = 200, y = 300)
Button(screen1, text = "Go to login", command = Login).place(x = 200, y = 350)
def register_user():
Firstname_info = Firstname.get()
Surname_info = Surname.get()
Registrationnumber_info = Registrationnumber.get()
username_info = username.get()
password_info = password.get()
c.execute("CREATE TABLE IF NOT EXISTS User_Information (Firstname TEXT , Surname TEXT , Registration TEXT, Username TEXT, Password TEXT )")
c.execute("INSERT INTO User_Information (Firstname, Surname, Registration, Username, Password) VALUES(?, ?, ?, ?, ?)", (Firstname_info, Surname_info, Registrationnumber_info, username_info, password_info))
c.execute("CREATE TABLE IF NOT EXISTS Users (Username TEXT NOT NULL, Password TEXT NOT NULL)")
c.execute("INSERT INTO Users (Username, Password) VALUES(?, ?)", (username_info, password_info, ))
conn.commit()
User_registered()
Firstname_entry.delete(0, END)
Surname_entry.delete(0, END)
Registrationnumber_entry.delete(0, END)
username_entry.delete(0, END)
password_entry.delete(0, END)
def User_registered():
screen5 = Tk()
screen5.title("Registration Complete")
screen5.geometry(popsize)
incorrect = Label(screen5, text = "User has been registered")
incorrect.pack()
Button(screen5, text = "okay", command = screen5.destroy).pack()
def Login():
global screen2
screen2 = Tk()
screen2.title("Login")
screen2.geometry(screensize)
Label(screen2, text = "Please enter details to login").pack()
Label(screen2, text = "").pack()
global username_verify
global password_verify
username_verify = StringVar()
password_verify = StringVar()
Label(screen2, text = "Username").pack()
global username_entry1
username_entry1 = Entry(screen2, textvariable = username_verify)
username_entry1.pack()
Label(screen2, text = "Password").pack()
global password_entry1
password_entry1 = Entry(screen2, textvariable = password_verify)
password_entry1.pack()
Label(text = "")
Button(screen2, text = "Login now",width = 10, height = 2, command = fetch_login).pack()
Button(screen2, text = "Register new User", command = register).pack()
screen.destroy()
def fetch_login():
Uname = username_entry1.get()# Entry from UI
Pword = password_entry1.get()# Entry from UI
a = (Uname,)#Converting entry to tuple to match table data
b = (Pword, )#Converting entry to tuple to match table data
d = (a + b)
print(d)
print(type(d))# To ensure that entry is now a tuple
c.execute('SELECT * FROM Users')
data = c.fetchall()
for row in data:
print(row)# To see what SQLite3 table data is being drawn
if d in data:
c.execute('SELECT Password FROM Users WHERE Username = ?',(a))
pdata = c.fetchall()
print(pdata)
if b in pdata:
Login_success()
else:
password_incorrect()
else:
User_not_found()
def password_incorrect():
screen4 = Tk()
screen4.title("ERROR!")
screen4.geometry(popsize)
incorrect = Label(screen4, text = "Password incorrect!")
incorrect.pack()
Button(screen4, text = "okay", command = screen4.destroy).pack()
def User_not_found():
screen5 = Tk()
screen5.title("ERROR!")
screen5.geometry("300x100")
not_found = Label(screen5, text = "User not found or password incorrect!")
not_found.pack()
Button(screen5, text = "okay", command = screen5.destroy).pack()
def Login_success():
Main_Page()
screen2.destroy()
def Main_Page():
global screen3
screen3 = Tk()
screen3.geometry(screensize)
screen3.title("Main Page")
menubar = tk.Menu(screen3)
Filemenu = tk.Menu(menubar, tearoff = 0)
Filemenu.add_command(label = "Add Asset", command = Add_Asset)
Filemenu.add_separator()
Filemenu.add_command(label = "Dispose Asset", command = Dipose_Asset)
Filemenu.add_separator()
Filemenu.add_command(label = "Edit Asset", command = Edit_Asset)
Filemenu.add_separator()
Filemenu.add_command(label = "Exit", command = quit)
Filemenu.add_separator()
menubar.add_cascade(label = "File", menu = Filemenu)
screen3.config(menu=menubar)
def Add_Asset():
print("Asset Added")
def Dipose_Asset():
print("Dispose Asset")
def Edit_Asset():
print("Asset Added")
def app_start():
main_screen()
mainloop()
app_start()
Я новичок в программировании.Любые рекомендации относительно процесса проверки пароля будут приветствоваться.Мне пришлось преобразовать свои записи в кортежи, чтобы сравнить их с данными из таблицы.
Это оригинальный код, когда он работал.
import tkinter as tk
from tkinter import *
import os
import time
import datetime
import sqlite3
screensize = "500x500"
popsize = "150x150"
conn = sqlite3.connect('UserInfo.db')
c = conn.cursor()
def register():
global screen1
screen1 = Toplevel(screen)
screen1.title("Register")
screen1.geometry(screensize)
global username
global password
username = StringVar()
password = StringVar()
Label(screen1, text = "Please enter details below")
Label(screen1, text = "")
Label(screen1,text = "Username *").pack()
global username_entry
username_entry = Entry(screen1, textvariable = username)
username_entry.pack()
Label(screen1,text = "password *").pack()
global password_entry
password_entry = Entry(screen1, textvariable = password)
password_entry.pack()
Button(screen1, text = "Register user now", command =
register_user).pack()
Button(screen1, text = "Go to login", command = Login).pack()
def register_user():
username_info = username.get()
password_info = password.get()
c.execute("CREATE TABLE IF NOT EXISTS Users (Username TEXT NOT NULL,
Password TEXT NOT NULL)")
c.execute("INSERT INTO Users (Username, Password) VALUES(?, ?)",
(username_info, password_info, ))
conn.commit()
User_registered()
username_entry.delete(0, END)
password_entry.delete(0, END)
def User_registered():
screen5 = Tk()
screen5.title("Registration Complete")
screen5.geometry(popsize)
incorrect = Label(screen5, text = "User has been registered")
incorrect.pack()
Button(screen5, text = "okay", command = screen5.destroy).pack()
def Login():
global screen2
screen2 = Toplevel(screen)
screen2.title("Login")
screen2.geometry(screensize)
Label(screen2, text = "Please enter details to login").pack()
Label(screen2, text = "").pack()
global username_verify
global password_verify
username_verify = StringVar()
password_verify = StringVar()
Label(screen2, text = "Username").pack()
global username_entry1
username_entry1 = Entry(screen2, textvariable = username_verify)
username_entry1.pack()
Label(screen2, text = "Password").pack()
global password_entry1
password_entry1 = Entry(screen2, textvariable = password_verify)
password_entry1.pack()
Label(text = "")
Button(screen2, text = "Login now",width = 10, height = 2, command =
fetch_login).pack()
Button(screen2, text = "Register new User", command = register).pack()
def fetch_login():
Uname = username_entry1.get()# Entry from UI
Pword = password_entry1.get()# Entry from UI
a = (Uname,)#Converting entry to tuple to match table data
b = (Pword, )#Converting entry to tuple to match table data
d = (a + b)
print(d)
print(type(d))# To ensure that entry is now a tuple
c.execute('SELECT * FROM Users')
data = c.fetchall()
for row in data:
print(row)# To see what SQLite3 table data is being drawn
if d in data:
c.execute('SELECT Password FROM Users WHERE Username = ?',(a))
pdata = c.fetchall()
print(pdata)
if b in pdata:
Login_success()
else:
password_incorrect()
else:
User_not_found()
def password_incorrect():
screen4 = Toplevel(screen2)
screen4.title("ERROR!")
screen4.geometry(popsize)
incorrect = Label(screen4, text = "Password incorrect!")
incorrect.pack()
Button(screen4, text = "okay", command = screen4.destroy).pack()
def User_not_found():
screen5 = Toplevel(screen2)
screen5.title("ERROR!")
screen5.geometry("300x100")
not_found = Label(screen5, text = "User not found or password
incorrect!")
not_found.pack()
Button(screen5, text = "okay", command = screen5.destroy).pack()
def Login_success():
Main_Page()
def Main_Page():
global screen3
screen3 = Toplevel(screen2)
screen3.geometry(screensize)
screen3.title("Main Page")
menubar = tk.Menu(screen3)
Filemenu = tk.Menu(menubar, tearoff = 0)
Filemenu.add_command(label = "Add Asset", command = Add_Asset)
Filemenu.add_separator()
Filemenu.add_command(label = "Dispose Asset", command = Dipose_Asset)
Filemenu.add_separator()
Filemenu.add_command(label = "Edit Asset", command = Edit_Asset)
Filemenu.add_separator()
Filemenu.add_command(label = "Exit", command = quit)
Filemenu.add_separator()
menubar.add_cascade(label = "File", menu = Filemenu)
screen3.config(menu=menubar)
def Add_Asset():
print("Asset Added")
def Dipose_Asset():
print("Dispose Asset")
def Edit_Asset():
print("Asset Added")
def main_screen():
global screen
screen = Tk()
screen.geometry(screensize)
screen.title("Main Screen")
Label(text = "Notes", bg = "grey", width = "300", height = "2", font =
("Calibri", 12)).pack()
Label(text = "").pack()
Button(text = "Login", height = "2", width = "30", command =
Login).pack()
Label(text = "").pack()
Button(text = "Register", height = "2", width = "30" , command =
register).pack()
screen.mainloop()
main_screen()
Разница в основном в "Toplevel". Я изменил каждое определение, чтобы оно имело собственный экран = Tk (), чтобы я мог уничтожить каждую страницу после того, как она ввела данные и "Зарегистрировано" или "Зарегистрировано"