0

When trying to run my code, I am presented with a TypeError. It states: TypeError:'in'requires string as left operand, not method.

I am not sure what this means exactly, or how to fix it.

The code the error is created in is:

from tkinter import *
from tkinter import messagebox

def saveCustomer() :

    ClientID = ClientIDVar.get()
    ClientID = ClientID.ljust(50)
    Surname = SurnameVar.get()
    Surname = Surname.ljust(50)
    Forename = ForenameVar.get()
    Forename = Forename.ljust(50)
    Age = AgeVar.get()
    Age = Age.ljust(50)
    Gender = GenderVar.get()
    Gender = Gender.ljust(50)

    #lengthcheck
    ClientID = ClientIDVar.get()
    if len(ClientID) > 5 :
        messagebox.showerror("Error","Too many characters in ClientID")
        return
    Surname = SurnameVar.get()
    if len(Surname) > 20 :
        messagebox.showerror("Error","Too many characters in Surname")
        return
    Forename = ForenameVar.get()
    if len(Forename) > 15 :
        messagebox.showerror("Error","Too many characters in Forename")
        return
    Age = AgeVar.get()
    if len(Age) > 2 :
        messagebox.showerror("Error","Too many characters in Age")
        return
    Gender = GenderVar.get()
    if len(Gender) > 2 :
        messagebox.showerror("Error","Too many characters in Gender")
        return
    #presencecheck
    if ClientID == "":
        messagebox.showerror("Error","Please enter characters into ClientID")
        return
    if Surname == "":
        messagebox.showerror("Error","Please enter characters into Surname")
        return
    if Forename == "":
        messagebox.showerror("Error","Please enter characters into Forename")
        return
    if Age == "":
       messagebox.showerror("Error","Please enter characters into Age")
        return
    if Gender == "":
        messagebox.showerror("Error","Please enter characters into Gender")
        return
    #rangecheck
    if (int(Age) < 18) or (int(Age) > 99):
        messagebox.showerror("Error","Please enter an age between 18 and 99")
        return
    #typecheck
    if not ClientID.isnumeric():
        messagebox.showerror("Error","Please enter alphabetical characters and numerical values into ClientID")
        return
    if not Surname.isalpha():
        messagebox.showerror("Error","Please enter alphabetical characters into Surname")
        return
    if not Forename.isalpha():
        messagebox.showerror("Error","Please enter alphabetical characters into Forename")
        return
    if not Age.isnumeric():
        messagebox.showerror("Error","Please enter numerical values into Age")
        return
    if not Gender.isalpha():
        messagebox.showerror("Error","Please enter alphabetical characters and numerical values into Gender")
        return







    #open the file to append - if it's not there it'll be created
    fileObject = open("Customers.txt","a")
    # write to the file with a newline character at the end
    fileObject.write(ClientID + Surname + Forename + Age + Gender + "\n")
    fileObject.close()

    return

def searchCustomer() :
    Found = "N"
    ClientID = ClientIDVar.get
    # try opening the file for reading
    try:
        fileObject=open("Customers.txt","r")

    # if it's not there then say
    except IOError:
        messagebox.showerror("Error","No file to read")

    # if we did open it then let's carry on!
    else:
        while True:

            recordVar=fileObject.readline()
            # Python keeps reading till EOF then returns a blank
            if recordVar=="":
                fileObject.close()
                break

            if ClientID in recordVar[0:50] and not ClientID=="" :
                Found = "T"
                messagebox.showinfo("Information",str(RecordVar))
                break

    if Found == "F":
        messagebox.showerror("Error","No Customer found.")
    return



def makeWindow():
    #declared my globals here as this is the 1st routine called
    # the other routines have to be in front of this one as they get called by it
    # and the parser would get upset if they weren't there

    global ClientIDVar, SurnameVar, ForenameVar, AgeVar, GenderVar

    #here's my window
    win = Tk()
    win.wm_title("FitnessCentre")
    #split into two sections then further split into a grid
    frame1=Frame(win)
    frame1.pack()

    Label(frame1, text="Fitness Leisure Centre", font=("Helvetica 12             bold")).grid(row=0, column=0)

    Label(frame1, text="ClientID").grid(row=1, column=0, sticky=W)
    ClientIDVar=StringVar()
    title= Entry(frame1, textvariable=ClientIDVar)
    title.grid(row=1,column=1,sticky=W)

    Label(frame1, text="Surname").grid(row=2, column=0, sticky=W)
    SurnameVar=StringVar()
    genre= Entry(frame1, textvariable=SurnameVar)
    genre.grid(row=2,column=1,sticky=W)

    Label(frame1, text="Forename").grid(row=3, column=0, sticky=W)
    ForenameVar=StringVar()
    director= Entry(frame1, textvariable=ForenameVar)
    director.grid(row=3,column=1,sticky=W)

    Label(frame1, text="Age").grid(row=4, column=0, sticky=W)
    AgeVar=StringVar()
    leadactor= Entry(frame1, textvariable=AgeVar)
    leadactor.grid(row=4,column=1,sticky=W)

    Label(frame1, text="Gender").grid(row=5, column=0, sticky=W)
    GenderVar=StringVar()
    duration= Entry(frame1, textvariable=GenderVar)
    duration.grid(row=5,column=1,sticky=W)

    frame2 = Frame(win)
    frame2.pack()

    # build my buttons in the other frame then pack them side by side
    b1= Button(frame2, text=" Save ", command=saveCustomer)
    b2= Button(frame2, text=" Search ", command=searchCustomer)
    b1.pack(side=LEFT); b2.pack(side=LEFT)

    return win


#main program!
win = makeWindow()
win.mainloop()

The complete error message I received was:

Exception in Tkinter callback
Traceback (most recent call last):

if ClientID in recordVar[0:50] and not ClientID=="" :
TypeError: 'in <string>' requires string as left operand, not method
2
  • 1
    Is your code formatted incorrectly? You have a def for a function, but the remaining code is left-aligned. Also, please paste the exact error you're seeing. Commented Jun 8, 2017 at 14:34
  • It's formatted correctly in python, I'll update it here so it looks how it does on python. Commented Jun 8, 2017 at 14:54

2 Answers 2

1

Quoting from question:

TypeError: 'in' requires string as left operand, not method.

So somewhere you are using the in operator with a method on the left, not a string as expected. Had you posted the entire error/stack trace (as you should have done) we might have seen which line is causing the error. With a quick scan of your code I'd guess the error is here:

ClientID = ClientIDVar.get

Presumably you wanted to return the value of the ClientIDVar, not its get method (which is what you got). So it's a simple fix -- call the function properly:

ClientID = ClientIDVar.get()
Sign up to request clarification or add additional context in comments.

Comments

0

You can't use an method to test an in comparison, you have to compare with a string:

if ClientID in recordVar[0:50] and not ClientID=="" :

The error that you get are clearly explaining this to you:

TypeError. It states: TypeError:'in'requires string as left operand, not method.

1 Comment

I used code very similar to this in another program and it worked without an error. Do you have any suggestions on how to fix it?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.