Насколько важна последовательность функций? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть пользовательская программа для входа / регистрации для проверки данных и базы данных 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 (), чтобы я мог уничтожить каждую страницу после того, как она ввела данные и "Зарегистрировано" или "Зарегистрировано"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...