I have to make a CRUD app in tkinter for my school project.
I made sign up and login so far. Now i want to get variable user_data from class App in main.py in the class User in user.py. To display user data in User window.
main.py
from tkinter import *
from tkinter.messagebox import showerror
import sqlite3
db = sqlite3.connect("wypożyczalnia_aut.db")
cursor = db.cursor()
class App(Tk):
def __init__(self):
super().__init__()
self.title("Zaloguj Się")
self.geometry("300x400")
login_font = ("Comic Sans MS", 20, "bold")
Label(self, text="Zaloguj Się", font=login_font).pack(padx=10, pady=10)
self.username = Entry(self)
self.password = Entry(self, show="*")
self.username.pack(padx=10, pady=10)
self.password.pack(padx=10, pady=10)
self.login_btn = Button(self,text="Zaloguj Się", command=self.login).pack(padx=10, pady=10)
self.sign_up_btn = Button(self,text="Zarejestruj Się", command=self.open_window_sign_up).pack(padx=10, pady=10)
def open_window_sign_up(self):
from sign_up import SignUp
sign_up_window = SignUp(self)
sign_up_window.grab_set()
def login(self):
from user import User
cursor.execute("SELECT * FROM uzytkownicy WHERE nazwa=? AND haslo=?", (self.username.get(), self.password.get()))
global user_data
user_data = cursor.fetchone()
if user_data is not None:
user_window = User(self)
user_window.grab_set()
else:
showerror(title='Błąd',message='Niepoprawna Nazwa/Hasło')
if __name__ == "__main__":
app = App()
app.mainloop()
db.commit()
db.close()
user.py
from tkinter import *
import sqlite3
import main
class User(Toplevel):
def __init__(self,parent):
super().__init__(parent)
self.geometry("1280x720")
self.title("Panel Użytkownika")
self.data = main.user_data
And im getting error: AttributeError: module 'main' has no attribute 'user_data'
>Solution :
You can simply pass user_data to instance of User instead of using global variable.
main.py
...
class App(Tk):
...
def login(self):
from user import User
cursor.execute("SELECT * FROM uzytkownicy WHERE nazwa=? AND haslo=?", (self.username.get(), self.password.get()))
#global user_data
user_data = cursor.fetchone()
if user_data is not None:
user_window = User(self, user_data) # pass user_data to User
user_window.grab_set()
else:
showerror(title='Blad',message='Niepoprawna Nazwa/Haslo')
...
user.py
class User(Toplevel):
def __init__(self, parent, user_data): # added argument user_data
super().__init__(parent)
self.geometry("1280x720")
self.title("Panel Uzytkownika")
self.data = user_data