title: How to fix 'AttributeError: partially initialized module 'SendEmail' has no attribute 'send_email' (most likely due to a circular import)'
body: <p>So I am creating a Gmail Sender app using Tkinter and I have a function called send_email and it is inside the SendEmail.py. But every time I run the code it gives me this error:</p>
  <pre><code>Exception in Tkinter callback
  Traceback (most recent call last):
    File &quot;C:\Users\User\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py&quot;, line 1885, in __call__
      return self.func(*args)
    File &quot;C:\Users\User\Desktop\Coding\Python\GmailSenderApp\Main.py&quot;, line 114, in &lt;lambda&gt;
      send = tk.Button(mainframe, text=&quot;Send Email&quot;, font=('Calibri', 15), command=lambda: SendEmail.send_email())
  AttributeError: partially initialized module 'SendEmail' has no attribute 'send_email' (most likely due to a circular import)
  </code></pre>
  <p>In Main.py I am importing SendMail.py because it contains the function that sends the email
  Here is Main.py code:</p>
  <pre><code>import tkinter as tk
  import time
  from tkinter import filedialog
  import SendEmail
  
  # Main Screen
  root = tk.Tk()
  root.resizable(False, False)
  root.title('Mail Sender')
  
  # Icon
  icon = tk.PhotoImage(file='icon.png')
  root.iconphoto(False, icon)
  
  # Canvas
  canvas = tk.Canvas(root, height=600, width=700)
  canvas.pack()
  
  # title
  titleFrame = tk.Frame(root)
  titleFrame.place(relx=0.5, rely=0.025, relwidth=0.75, relheight=0.1, anchor='n')
  
  title = tk.Label(titleFrame, text=&quot;Mail Sender&quot;, font=('Calibri', 20))
  title.pack()
  
  # Main frame
  mainframe = tk.Frame(root, bg='#80c1ff', bd=10)
  mainframe.place(relx=0.5, rely=0.15, relwidth=1, relheight=0.85, anchor='n')
  
  # Email
  email = tk.Label(mainframe, text=&quot;Enter Email:&quot;, font=('Calibri', 15))
  email.place(y=2.5)
  
  email_str = tk.StringVar()
  
  emailEntry = tk.Entry(mainframe, textvariable=email_str, font=('Calibri', 15))
  emailEntry.place(y=35, width=300)
  
  # password
  password = tk.Label(mainframe, text=&quot;Enter Password:&quot;, font=('Calibri', 15))
  password.place(y=80)
  
  password_str = tk.StringVar()
  
  passwordEntry = tk.Entry(mainframe, textvariable=password_str, show=&quot;\u2022&quot;, font=('Calibri', 15))
  passwordEntry.place(y=115, width=300)
  
  # receiver
  receiver = tk.Label(mainframe, text=&quot;Enter Receiver Email:&quot;, font=('Calibri', 15))
  receiver.place(y=150)
  
  receiver_str = tk.StringVar()
  
  receiverEntry = tk.Entry(mainframe, textvariable=receiver_str, font=('Calibri', 15))
  receiverEntry.place(y=185, width=300)
  
  # subject
  subject = tk.Label(mainframe, text=&quot;Enter Subject:&quot;, font=('Calibri', 15))
  subject.place(y=220)
  
  subject_str = tk.StringVar()
  
  subjectEntry = tk.Entry(mainframe, textvariable=subject_str, font=('Calibri', 15))
  subjectEntry.place(y=255, width=300)
  
  # body
  body = tk.Label(mainframe, text=&quot;Enter Body:&quot;, font=('Calibri', 15))
  body.place(x=500, y=2.5)
  
  body_str = tk.StringVar()
  
  bodyEntry = tk.Text(mainframe)
  bodyEntry.place(x=380, y=35, width=300)
  
  # notification
  notif = tk.Label(mainframe, bg='#80c1ff', font=('Calibri', 15))
  notif.place(x=250, y=450)
  
  # attachments array
  attachments = []
  
  
  # add attacments function
  def add_attachments():
      filename = filedialog.askopenfilename(initialdir='C:/', title=&quot;Select a file to attach to the email&quot;)
      attachments.append(filename)
  
      notif.config(text=&quot;Attached &quot; + str(len(attachments)) + &quot; file&quot;, fg=&quot;green&quot;)
  
      root.update()
      time.sleep(2.5)
  
      notif.config(text=&quot;&quot;)
  
  
  def reset_entries():
      emailEntry.delete(0, 'end')
      passwordEntry.delete(0, 'end')
      receiverEntry.delete(0, 'end')
      subjectEntry.delete(0, 'end')
      bodyEntry.delete(&quot;1.0&quot;, &quot;end-1c&quot;)
  
      notif.config(text=&quot;Entries were reset&quot;, fg=&quot;green&quot;)
  
      root.update()
      time.sleep(2.5)
  
      notif.config(text=&quot;&quot;)
  
  
  # send button
  send = tk.Button(mainframe, text=&quot;Send Email&quot;, font=('Calibri', 15), command=lambda: SendEmail.send_email())
  send.place(y=310, width=150)
  
  # reset button
  reset = tk.Button(mainframe, text=&quot;Reset&quot;, font=('Calibri', 15), command=lambda: ResetEntries.reset_entries())
  reset.place(x=220, y=310, width=150)
  
  # attachments button
  attachment = tk.Button(mainframe, text=&quot;Add Attachments&quot;, font=('Calibri', 15), command=lambda: add_attachments())
  attachment.place(x=90, y=365, width=200)
  
  # Main loop
  root.mainloop()
  </code></pre>
  <p>In the SendMail.py I have import Main.py because I am using variables from that file
  Here is the SendMain.py code:</p>
  <pre><code>import Main
  import smtplib
  import time
  from email.message import EmailMessage
  
  
  # send function
  def send_email():
      try:
          msg = EmailMessage()
  
          emailText = Main.email_str.get()
          passwordText = Main.password_str.get()
          receiverText = Main.receiver_str.get()
          subjectText = Main.subject_str.get()
          bodyText = Main.bodyEntry.get(&quot;1.0&quot;, &quot;end-1c&quot;)
  
          msg['Subject'] = subjectText
          msg['From'] = emailText
          msg['To'] = receiverText
          msg.set_content(bodyText)
  
          if emailText == &quot;&quot; or passwordText == &quot;&quot; or receiverText == &quot;&quot; or subjectText == &quot;&quot; or bodyText == &quot;&quot;:
              Main.notif.config(text=&quot;All fields are required!&quot;, fg=&quot;red&quot;)
  
              Main.root.update()
              time.sleep(2.5)
  
              Main.notif.config(text=&quot;&quot;)
              return
          else:
              server = smtplib.SMTP('smtp.gmail.com', 587)
              server.starttls()
              server.login(emailText, passwordText)
              server.send_message(msg)
  
              Main.emailEntry.delete(0, 'end')
              Main.passwordEntry.delete(0, 'end')
              Main.receiverEntry.delete(0, 'end')
              Main.subjectEntry.delete(0, 'end')
              Main.bodyEntry.delete(&quot;1.0&quot;, &quot;end-1c&quot;)
  
              Main.notif.config(text=&quot;Email Sent!&quot;, fg=&quot;green&quot;)
  
              Main.root.update()
              time.sleep(2.5)
  
              Main.notif.config(text=&quot;&quot;)
      except:
          Main.notif.config(text=&quot;There was a error please try again&quot;, fg=&quot;red&quot;)
  
          Main.root.update()
          time.sleep(2.5)
  
          Main.notif.config(text=&quot;&quot;)
  </code></pre>
  <p>So does anyone know how to solve this problem I am stuck I can't figure it out. Thanks in advance</p>