【问题标题】:How do I call a variable from one class to another?如何将变量从一个类调用到另一个类?
【发布时间】:2021-05-07 08:09:21
【问题描述】:

我试图将登录类中的变量显示到我的菜单类,但每当我这样做时,我总是得到错误 Object login has no attribute user。

这是我的login.py 文件

 def login(self):
        global con
        user = self.txt_user.get().strip()
        pwd = self.txt_pass.get().strip()
        if user == "" or pwd == "":
            messagebox.showerror("Error", "Please fill up all fields!")
        else:
            try :
                con=pymysql.connect(host="localhost",user="root",password="",database="employee")
                cur=con.cursor()
                cur.execute("select 1 from employeelist where username=%s and password=%s", (user,pwd))
                if cur.rowcount == 1:
                    messagebox.showinfo("Success", "Login Successful", parent=self.root)
                    self.menu()
                else:
                    messagebox.showerror("Error", "Wrong Username or Password. Please try again!")
            except Exception as ex:
                messagebox.showerror("Error",f"Error due to: {str(ex)}",parent=self.root)
            finally:
                con.close()


    def menu(self):
        self.root.destroy()
        menu.MenuForm()

if __name__ == "__main__":
    root = Tk()
    obj = Login(root)
    root.mainloop()

这是我的menu.py 文件

from tkinter import *
from tkinter import ttk, messagebox
import PIL
from PIL import ImageTk
from PIL import Image
import login

class Menu:
    def __init__(self,root):
        self.root = root
        self.root.title("Main Menu")
        self.root.geometry("1350x768+0+0")
        self.root.resizable(False, False)
        self.bg = ImageTk.PhotoImage(file="Images/bgimage.jpg")
        bg = Label(self.root, image=self.bg).place(x=0, y=0, relwidth=1, relheight=1)
        framemenu = Frame(self.root, bg="white")

        framemenu.place(x=350, y=100, height=500, width=700)
        welcometitle = Label(framemenu, text="Welcome " + login.Login.user(), font=("Arial", 30, "bold"), fg="orange", bg="white").place(x=70,y=70)



def MenuForm():
    win = Tk()
    obj = Menu(win)


if __name__ == "__main__":
    root = Tk()
    obj = Menu(root)
    root.mainloop()

我在menu 类中导入了login,但它仍然给我错误对象没有实例。

【问题讨论】:

    标签: python sql database tkinter


    【解决方案1】:

    导入是不够的。 当您使用 objects 时,如果您想使用 object 首先您必须创建一个实例,然后您可以使用该实例,这是一个示例:

    class login():
            def __init__(self):
                    print("Hi im Login Object")
    
    class main():
            def __init__(self):
                    login_obj = login() # Instance created
    
    main()
    

    如您所见,我将 Login 类的实例创建为 main 类,然后它起作用了。

    输出:

    Hi im Login Object
    

    【讨论】:

      【解决方案2】:

      您可以按照@Hosseinreza 的方法来改进您的代码,但如果您想使用现有代码,请将用户属性传递给菜单类,如下面的代码摘录

      def login(self)
         if cur.rowcount == 1:
             messagebox.showinfo("Success", "Login Successful", parent=self.root)
             self.menu(user)
      
      def menu(self, user):
              self.root.destroy()
              menu.MenuForm(user)
      

      然后在 Menu 类中,您可以如下使用它:

      from tkinter import *
      from tkinter import ttk, messagebox
      import PIL
      from PIL import ImageTk
      from PIL import Image
      
      class Menu:
          def __init__(self,root, user):
              self.root = root
              self.root.title("Main Menu")
              self.root.geometry("1350x768+0+0")
              self.root.resizable(False, False)
              self.bg = ImageTk.PhotoImage(file="Images/bgimage.jpg")
              bg = Label(self.root, image=self.bg).place(x=0, y=0, relwidth=1, relheight=1)
              framemenu = Frame(self.root, bg="white")
      
              framemenu.place(x=350, y=100, height=500, width=700)
              welcometitle = Label(framemenu, text="Welcome " + user, font=("Arial", 30, "bold"), fg="orange", bg="white").place(x=70,y=70)
      
      
      
      def MenuForm(user):
          win = Tk()
          obj = Menu(win, user)
      
      
      if __name__ == "__main__":
          root = Tk()
          obj = Menu(root)
          root.mainloop()
      

      【讨论】:

        【解决方案3】:

        最好通过参数将用户传递给menu.MenuForm()

        class Login:
            ...
        
            def login(self):
                user = self.txt_user.get().strip()
                pwd = self.txt_pass.get().strip()
                if user == "" or pwd == "":
                    messagebox.showerror("Error", "Please fill up all fields!")
                else:
                    try :
                        con=pymysql.connect(host="localhost",user="root",password="",database="employee")
                        cur=con.cursor()
                        cur.execute("select 1 from employeelist where username=%s and password=%s", (user,pwd))
                        if cur.rowcount == 1:
                            messagebox.showinfo("Success", "Login Successful", parent=self.root)
                            self.menu(user) # pass user to self.menu()
                        else:
                            messagebox.showerror("Error", "Wrong Username or Password. Please try again!")
                    except Exception as ex:
                        messagebox.showerror("Error",f"Error due to: {str(ex)}",parent=self.root)
                    finally:
                        con.close()
        
            def menu(self, user):
                self.root.destroy()
                menu.MenuForm(user) # pass user to menu.MenuForm()
        

        menu.py:

        from tkinter import *
        #from tkinter import ttk, messagebox
        from PIL import Image, ImageTk
        
        class Menu:
            def __init__(self, root, user): # user passed as argument
                self.root = root
                self.root.title("Main Menu")
                self.root.geometry("1350x768+0+0")
                self.root.resizable(False, False)
                self.bg = ImageTk.PhotoImage(file="Images/bgimage.jpg")
                bg = Label(self.root, image=self.bg).place(x=0, y=0, relwidth=1, relheight=1)
                framemenu = Frame(self.root, bg="white")
        
                framemenu.place(x=350, y=100, height=500, width=700)
                welcometitle = Label(framemenu, text="Welcome " + user, font=("Arial", 30, "bold"), fg="orange", bg="white").place(x=70,y=70)
        
        def MenuForm(user): # user passed as argument
            win = Tk()
            obj = Menu(win, user) # pass user to `Menu` class
        
        if __name__ == "__main__":
            root = Tk()
            obj = Menu(root, "user")
            root.mainloop()
        

        【讨论】:

          猜你喜欢
          • 2013-12-01
          • 2014-01-03
          • 2019-09-05
          • 1970-01-01
          • 2013-02-08
          相关资源
          最近更新 更多