0

Could someone please advise why I am getting the following error:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1437, in __call__
    return self.func(*args)
  File "./transrecv.py", line 137, in Enter
    self.after(tTimer, self.Enter)
AttributeError: application instance has no attribute 'after'

I am trying to right the class so that it can either repeat the command or only do it once based on the information input by the user.

Code:

class application:

    def __init__(self,window):
        """Initialize the Application """
        self.IDbox = tk.Entry(window, width = 5)
        self.IDbox.pack(side="left", expand=True)
        self.IDbox.insert(0,"ID")

        self.msgTypeBox = tk.Entry(window)
        self.msgTypeBox.pack(side="left", expand=True)
        self.msgTypeBox.insert(0,"Message Type")

        self.canTypeBox = tk.Entry(window)
        self.canTypeBox.pack(side="left", expand=True)
        self.canTypeBox.insert(0,"Can Type")

        self.tData0Box = tk.Entry(window, width = 5)
        self.tData0Box.pack(side="left", expand=True)
        self.tData0Box.insert(0,"Data0")

        self.tData1Box = tk.Entry(window, width = 5)
        self.tData1Box.pack(side="left", expand=True)
        self.tData1Box.insert(0,"Data1")

        self.tData2Box = tk.Entry(window, width = 5)
        self.tData2Box.pack(side="left", expand=True)
        self.tData2Box.insert(0,"Data2")

        self.tData3Box = tk.Entry(window, width = 5)
        self.tData3Box.pack(side="left", expand=True)
        self.tData3Box.insert(0,"Data3")

        self.tData4Box = tk.Entry(window, width = 5)
        self.tData4Box.pack(side="left", expand=True)
        self.tData4Box.insert(0,"Data4")

        self.tData5Box = tk.Entry(window, width = 5)
        self.tData5Box.pack(side="left", expand=True)
        self.tData5Box.insert(0,"Data5")

        self.tData6Box = tk.Entry(window, width = 5)
        self.tData6Box.pack(side="left", expand=True)
        self.tData6Box.insert(0,"Data6")

        self.tData7Box = tk.Entry(window, width = 5)
        self.tData7Box.pack(side="left", expand=True)
        self.tData7Box.insert(0,"Data7")

        self.tTimerBox = tk.Entry(window, width = 5)
        self.tTimerBox.pack(side="left", expand=True)
        self.tTimerBox.insert(0,"0")

        self.TranButton = tk.Button(window,
                                    text="Transmit",
                                    command = self.Enter)
        self.TranButton.pack(side="bottom")

    def Enter(self):
        """ Someone Pressed Enter """
        canID = self.IDbox.get()
        msgType = self.msgTypeBox.get()
        canType = self.canTypeBox.get()
        DLC = 8
        tData0 = self.tData0Box.get()
        tData1 = self.tData1Box.get()
        tData2 = self.tData2Box.get()
        tData3 = self.tData3Box.get()
        tData4 = self.tData4Box.get()
        tData5 = self.tData5Box.get()
        tData6 = self.tData6Box.get()
        tData7 = self.tData7Box.get()
        tTimer = self.tTimerBox.get()
        print("You tranmitted >> %s %s %s %d %s %s %s %s %s %s %s %s " %
             (msgType, canType, canID, DLC,  tData0, tData1,
               tData2, tData3, tData4, tData5, tData6, tData7))
        if int(tTimer) <= 0:
            system('echo "%s %s 0x%s %d 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s 0x%s" >/dev/pcan33' %
                    (msgType, canType, canID, DLC, tData0, tData1,
                     tData2, tData3, tData4, tData5, tData6, tData7))
        else:
            self.after(tTimer, self.Enter)

 root = tk.Tk()

 myapp = application(root)
 root.mainloop()
2
  • There is no method or attribute in the class named after. Commented Mar 2, 2015 at 11:36
  • Should be window.after() Commented Mar 2, 2015 at 11:40

1 Answer 1

1

Like the error says, your class has no attribute after. after is a method of Tkinter widgets, and your class doesn't inherit from any widgets.

I suggest fixing your code to be like this:

class application:

def __init__(self,window):
    ...
    self.window = window
    ...
def Enter(self):
    ...
    if int(tTimer) <= 0:
        ...
    else:
        self.window.after(tTimer, self.Enter)

Another solution is to create your own after method that calls self.window.after.

Sign up to request clarification or add additional context in comments.

Comments

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.