tags:

views:

90

answers:

4

I wrote the following code in python

self._job = None

#slider
def sliderCallback(self):
   if self._job:

And I get this error message

AttributeError: 'str' object has no attribute '_job'

why ? I thought I have initialized the variable before...

Update Same issue with Timer variable

import Tkinter as tk
import vtk
from time import *
from threading import *
from vtk.tk import *
from Visualization import *
from Histogram import *
from ListItem import *

class UI(tk.Frame): 

    def build(self, root):

        #left column
        self.leftFrame = tk.Frame(root, width=400, height=550, bg="black") #.grid(column=4, row=0)
        self.leftFrame.pack(fill=tk.BOTH, expand=True, side=tk.LEFT)

        #right column
        self.rightFrame = tk.Frame(root, width=400, height=550, bg="black") #.grid(column=4, row=0)
        self.rightFrame.pack(fill=tk.BOTH, expand=True, side=tk.RIGHT)
        #self.rightBottomFrame = tk.Frame(rightFrame, width=400, height=550, bg="red") #.grid(column=4, row=0)

        #visualization
        self.vis = Visualization(self.rightFrame, 400, 350, tk.RIGHT)
        #self.vis.updateContourValue(400)

        #left column
        self.middleFrame = tk.Frame(root, width=400, height=550, bg="black") #.grid(column=0, columnspan=4, row=0)
        self.middleFrame.pack(fill=tk.Y, expand=True)

        #isosurfaces list
        def addItem(color, volume, surface):        
            listitem = ListItem(self.listFrame, color, volume, surface)

        self.listFrame = tk.Frame(self.middleFrame, width=400, height=500, bg="black") #.grid(column=0, columnspan=4, row=0)
        self.listFrame.pack(fill=tk.BOTH, expand=True, side=tk.TOP)
        addItem("#243", self.vis.getVolume(), self.vis.getSurface())

        #preview
        self.preview = Visualization(self.middleFrame, 200, 200, tk.BOTTOM)
        #self.preview.updateContourValue(1500)

        #histogram
        self.histFrame = Histogram(self.leftFrame, 400, 400, tk.TOP, self.preview.getData())


        #slider
        def updateValue(self):
            self.preview.updateContourValue(float(self.slider.get() ))
            print "updated value"

        self.timer = Timer(5.0, updateValue)

        def sliderCallback(self):
            self.timer.cancel()
            self.timer.start() # after 30 seconds, "hello, world" will be printed
            #if self._job:
                #root.after_cancel(self._job)
                #print "remove it"
            #self._job = root.after(500, self.updateValue)

        #def updateValue(value):
            #print('horizontal: {v}'.format(v=value))

        self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=sliderCallback) #.grid(column=0, columnspan=3, row=1)
        self.slider.pack(in_=self.leftFrame, fill=tk.X)
        self.slider.set(200)

        #add Isosurface button
        def addIso():
            addItem("#243", self.vis.getVolume(), self.vis.getSurface())

        self.addButton = tk.Button(self.leftFrame, text="Add", command=addIso) #.grid(column=3, row=1)
        self.addButton.pack(in_=self.leftFrame, side="right", pady=2)
A: 

if this is happening in class: try change self._job = None to _job = None - at that step self is not declared, i think

foret
nope, this would raise a NameError
knitti
A: 

Edit: With your newly provided code, there does not seem to be the definition of self._job or _job in the class.

Based on your current information, for some reason the function is receiving a string for self instead of an instance of the class you've defined.

AndrewBC
+1  A: 

try this:


self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=self.sliderCallback)

the difference is the self, when invoked sliderCallback has to be bound to its instance to be useful.

knitti
A: 

updateValue and sliderCallback must be defined as methods of the class. You defined them as local functions of the build method. In addition, consider kitti's answer.

Bernd Petersohn