#python #tkinter
#python #tkinter
Вопрос:
Я пытаюсь создать форму входа и регистрации на python с помощью Tkinter. У меня такая проблема, я хочу открыть новую игру с именем формы после успешного входа в систему, но я не знаю, как это сделать и что я должен изменить в своем коде.
Это мой код:
from tkinter import *
import tkinter.messagebox as tkMessageBox
import sqlite3
root = Tk()
root.title("Python: Simple Inventory System")
width = 640
height = 480
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width/2) - (width/2)
y = (screen_height/2) - (height/2)
root.geometry("%dx%d %d %d" % (width, height, x, y))
root.resizable(0, 0)
#=======================================VARIABLES=====================================
USERNAME = StringVar()
PASSWORD = StringVar()
FIRSTNAME = StringVar()
LASTNAME = StringVar()
#=======================================METHODS=======================================
def Database():
global conn, cursor
conn = sqlite3.connect("db_member.db")
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS `member` (mem_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, username TEXT, password TEXT, firstname TEXT, lastname TEXT)")
def Exit():
result = tkMessageBox.askquestion('System', 'Are you sure you want to exit?', icon="warning")
if result == 'yes':
root.destroy()
exit()
def LoginForm():
global LoginFrame, lbl_result1
LoginFrame = Frame(root)
LoginFrame.pack(side=TOP, pady=80)
lbl_username = Label(LoginFrame, text="Username:", font=('arial', 25), bd=18)
lbl_username.grid(row=1)
lbl_password = Label(LoginFrame, text="Password:", font=('arial', 25), bd=18)
lbl_password.grid(row=2)
lbl_result1 = Label(LoginFrame, text="", font=('arial', 18))
lbl_result1.grid(row=3, columnspan=2)
username = Entry(LoginFrame, font=('arial', 20), textvariable=USERNAME, width=15)
username.grid(row=1, column=1)
password = Entry(LoginFrame, font=('arial', 20), textvariable=PASSWORD, width=15, show="*")
password.grid(row=2, column=1)
btn_login = Button(LoginFrame, text="Login", font=('arial', 18), width=35, command=Login)
btn_login.grid(row=4, columnspan=2, pady=20)
lbl_register = Label(LoginFrame, text="Register", fg="Blue", font=('arial', 12))
lbl_register.grid(row=0, sticky=W)
lbl_register.bind('<Button-1>', ToggleToRegister)
def RegisterForm():
global RegisterFrame, lbl_result2
RegisterFrame = Frame(root)
RegisterFrame.pack(side=TOP, pady=40)
lbl_username = Label(RegisterFrame, text="Username:", font=('arial', 18), bd=18)
lbl_username.grid(row=1)
lbl_password = Label(RegisterFrame, text="Password:", font=('arial', 18), bd=18)
lbl_password.grid(row=2)
lbl_firstname = Label(RegisterFrame, text="Firstname:", font=('arial', 18), bd=18)
lbl_firstname.grid(row=3)
lbl_lastname = Label(RegisterFrame, text="Lastname:", font=('arial', 18), bd=18)
lbl_lastname.grid(row=4)
lbl_result2 = Label(RegisterFrame, text="", font=('arial', 18))
lbl_result2.grid(row=5, columnspan=2)
username = Entry(RegisterFrame, font=('arial', 20), textvariable=USERNAME, width=15)
username.grid(row=1, column=1)
password = Entry(RegisterFrame, font=('arial', 20), textvariable=PASSWORD, width=15, show="*")
password.grid(row=2, column=1)
firstname = Entry(RegisterFrame, font=('arial', 20), textvariable=FIRSTNAME, width=15)
firstname.grid(row=3, column=1)
lastname = Entry(RegisterFrame, font=('arial', 20), textvariable=LASTNAME, width=15)
lastname.grid(row=4, column=1)
btn_login = Button(RegisterFrame, text="Register", font=('arial', 18), width=35, command=Register)
btn_login.grid(row=6, columnspan=2, pady=20)
lbl_login = Label(RegisterFrame, text="Login", fg="Blue", font=('arial', 12))
lbl_login.grid(row=0, sticky=W)
lbl_login.bind('<Button-1>', ToggleToLogin)
def ToggleToLogin(event=None):
RegisterFrame.destroy()
LoginForm()
def ToggleToRegister(event=None):
LoginFrame.destroy()
RegisterForm()
def Register():
Database()
if USERNAME.get == "" or PASSWORD.get() == "" or FIRSTNAME.get() == "" or LASTNAME.get == "":
lbl_result2.config(text="Please complete the required field!", fg="orange")
else:
cursor.execute("SELECT * FROM `member` WHERE `username` = ?", (USERNAME.get(),))
if cursor.fetchone() is not None:
lbl_result2.config(text="Username is already taken", fg="red")
else:
cursor.execute("INSERT INTO `member` (username, password, firstname, lastname) VALUES(?, ?, ?, ?)", (str(USERNAME.get()), str(PASSWORD.get()), str(FIRSTNAME.get()), str(LASTNAME.get())))
conn.commit()
USERNAME.set("")
PASSWORD.set("")
FIRSTNAME.set("")
LASTNAME.set("")
lbl_result2.config(text="Successfully Created!", fg="black")
cursor.close()
conn.close()
def Login():
Database()
if USERNAME.get == "" or PASSWORD.get() == "":
lbl_result1.config(text="Please complete the required field!", fg="orange")
else:
cursor.execute("SELECT * FROM `member` WHERE `username` = ? and `password` = ?", (USERNAME.get(), PASSWORD.get()))
if cursor.fetchone() is not None:
lbl_result1.config(text="You Successfully Login", fg="blue")
else:
lbl_result1.config(text="Invalid Username or password", fg="red")
LoginForm()
#========================================MENUBAR WIDGETS==================================
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Exit", command=Exit)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
#========================================INITIALIZATION===================================
if __name__ == '__main__':
root.mainloop()
Я хочу открыть новую форму с новой кнопкой после входа в систему (после этого сообщения "You Successfully Login"
).
Комментарии:
1. Ваш вопрос слишком расплывчатый. Как определяется успех входа в систему? Как будет отображаться «новая игра с именем формы»? Как отображаются более старые / предыдущие?
2. Кажется, у вас есть правильный ответ в вашем коде. Смотрите функцию ToggleToRegister(), похоже, это выполняет свою работу. Просто вставьте в него курсор «if». fetchone() не является None: и т.д. »
3. @tgrandje что я должен написать после not none??
Ответ №1:
Если я не ошибаюсь, ваши функции LoginForm и RegisterForm дают вам пример создания новой формы.
Ваши функции ToggleToLogin и ToggleToRegister позволяют вам перемещаться между этими формами.
Итак, у вас, похоже, есть все в этом коде (кроме, может быть, новой формы, которую вы хотите создать).
Например, попробуйте это :
cursor.execute("SELECT * FROM `member` WHERE `username` = ? and `password` = ?", (USERNAME.get(), PASSWORD.get()))
if cursor.fetchone() is not None:
lbl_result1.config(text="You Successfully Login", fg="blue")
ToggleToRegister()
Обратите внимание, что я не привык к tkinter и что я не пробовал ваш код; Я просто добавляю это как продолжение моего предыдущего комментария (поскольку комментарии не допускают форматированный код). Этот ответ является неопробованным предположением после просмотра вашего кода. Ничего больше…