Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to access function from another script without causing Attribute error

I have 2 scripts: mainmenu.py and join.py; the former gathers an input string from the user and have it displayed in a Label in the latter when button is pressed.

Mainmenu.py:

try:

    if __name__ == "__main__":
    
        .......

        def joinlobby(): #function to open join.py when button is pressed

            if (e2.index("end") == 0): #check if entry is blank

                tk.messagebox.showwarning("Fill the info!")

            else:
           
                master.withdraw()
                subprocess.call([sys.executable, "join.py"])

        def getvalueoflist():

            return e2.get()
    
        e2 = tk.Entry(frame3)
        e2.insert(0, "Enter your name")
        e2.grid(row = 0, column = 0)

        b4 = tk.Button(frame3, text = "Join", 
         bg = "Black", fg = "White", command = lambda: joinlobby())
        b4.grid(row = 1, column = 0)

Join.py

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import mainmenu

class GUI:

  def __init__(self):

        .......

        self.lname = tk.Label(self.lnameframe, text = mainmenu.getvalueoflist(), 
        font = ("Times New Roman", 15), fg = "Black")
        self.lname.pack(fill = "both")

Error:

File "join.py", line 32 in __init__
self.lname = tk.Label(self.lnameframe, text = mainmenu.getvalueoflist(), 
        font = ("Times New Roman", 15), fg = "Black")
    self.lname.pack(fill = "both")
AttributeError: module 'mainmenu' has no attribute 'getvalueoflist'

Any help is appreciated.

>Solution :

The code of mainmenu.py has this:

if __name__ == "__main__":
    ...

It’s also all inside a try .. block, which seems like not a great idea, but that doesn’t affect the problem you’re asking about.

The code after the if __name__ == "__main__": will only get executed if __name__ equals '__main__', which is to say, when the mainmenu.py file is executed independently.

So, the functions you define in that block, only get defined if mainmenu.py is executed directly as the main module.

But when you import mainmenu, that doesn’t happen. It’s loaded as a module, not as the main module, and so the function does not get defined and you get that error.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading