Search code examples
pythonwin32comattachmate-extra

TypeError: 'str' object is not callable with win32com interfacing with Attachmate


I'm using Python to try to automate Attachmate - EXTRA!, similar to how most do in VBA.

I'm using the package pywin32 found here. I'm using the documentation of how OLE works with Attachmate (where both GetString and PutString methods can be found) here.

My code:

system = win32com.client.Dispatch("EXTRA.System")
sess0 = system.ActiveSession

product = sess0.screen.GetString(0, 1, 2)

Produces the error:

line13: product = sess0.screen.GetString(1, 1, 2)
TypeError: 'str' object is not callable

The method GetString, is said to have syntax: rc = object.GetString (Row, Col, Length, [Page]), but my above attempt at this syntax in Python produces the error above.

I've researched this error and found that it's the equivalent of trying to do: "mystring"(). This shouldn't be, because when I check the type of my sess0 it indeed is a: <class 'win32com.client.CDispatch'>.

I know this problem may stem from the syntax being different than what is explained on the Attachmate/OLE page. However, the PutString method is explained to have this syntax: object.PutString String [,Row][,Col][,Page], but I got it working fine using: sess0.screen.PutString("90", 1, 79). That code correctly puts the string "90" at location 1, 79 in my Attachmate session.

I'm curious if maybe this is an issue with the package itself. If anyone has experience trying to automate Attachmate with Python, their help would be greatly appreciated!


Solution

  • I use these functions to read and write on an Attachmate EXTRA! Screen

    Try the following:

    import win32com.client
    
    def write(screen,row,col,text):
        screen.row = row
        screen.col = col
        screen.SendKeys(text)
    
    
    def read(screen,row,col,length,page=None):
        if page is None:
            return screen.Area(row, col, row, col+length).value
        else:
            return screen.Area(row, col, row, col+length, page).value
    
    
    def test():
        system = win32com.client.Dispatch("EXTRA.System")
        sess0 = system.ActiveSession
        screen = sess0.Screen
    
        product = read(screen, 1, 1, 2)
        print(product)
        write(screen, 1, 79, "90")
    

    Documentation:

    Screen.Area(StartRow,StartCol,EndRow,EndCol[,Page][,Type])

    SendKeys(String)