Fry
Fry

Reputation:

Why does namespace after method call changes?

I'm creating a class, but having some trouble with the namespacing in python.

You can see the code below, and it mostly works ok, but after the call to guiFrame._stateMachine() the time module is somehow not defined anymore.

If I re-import the time module in _stateMachine() it works. But why is the time module not in the namespace when I import it in the head?

Am I missing something?

The error message:

  File "C:\Scripts\Python\GUI.py", line 106, in <module>
    guiFrame._stateMachine()
  File "C:\Scripts\Python\GUI.py", line 74, in _stateMachine
    self.tempfile.write('%s cpuUMTS %s\n' % (time.asctime(time.localt
f.load.cpuThreadsValue['10094']))
UnboundLocalError: local variable 'time' referenced before assignment

The code:

import os
import cpu_load_internal
import throughput_internal
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

from Tkinter import *
import tkMessageBox
import time
class GUIFramework(Frame):
    """This is the GUI"""

    def __init__(self,master=None):
        """Initialize yourself"""

        """Initialise the base class"""
        Frame.__init__(self,master)

        """Set the Window Title"""
        self.master.title("Type Some Text")

        """Display the main window
        with a little bit of padding"""
        self.grid(padx=10,pady=10)
        self.CreateWidgets()
        plt.figure(1)

    def _setup_parsing(self):
        self.load = cpu_load_internal.CPULoad('C:\Templogs')
        self.throughput = throughput_internal.MACThroughput('C:\Templogs')
        self.tempfile = open('output.txt','w')
        self.state = 0        

    def _parsing(self):
        self.load.read_lines()
        self.throughput.read_lines()
        self.cpuLoad.set(self.load.cpuThreadsValue['10094'])
        self.macThroughput.set(self.throughput.macULThroughput)         

    def __change_state1(self):
        self.state = 2

    def __change_state3(self):
        self.state = 3     

    def CreateWidgets(self):
        """Create all the widgets that we need"""

        """Create the Text"""
        self.cpuLoad = StringVar()
        self.lbText1 = Label(self, textvariable=self.cpuLoad)
        self.lbText1.grid(row=0, column=0)

        self.macThroughput = StringVar()
        self.lbText2 = Label(self, textvariable=self.macThroughput)
        self.lbText2.grid(row=0, column=1)

        self.butStart = Button(self, text = 'Start', command = self.__change_state1)
        self.butStart.grid(row=1, column=0)

        self.butStop = Button(self, text = 'Stop', command = self.__change_state3)
        self.butStop.grid(row=1, column=1)

    def _stateMachine(self):
        if (self.state == 2):
            print self.throughput.macULUpdate
            print self.load.cpuUpdate

            if self.load.cpuUpdate:
                self.load.cpuUpdate = 0
                print 'cpuUMTS %s\n' % (self.load.cpuThreadsValue['10094'])
                self.tempfile.write('%s cpuUMTS %s\n' % (time.asctime(time.localtime()), self.load.cpuThreadsValue['10094']))            

            if self.throughput.macULUpdate:
                self.throughput.macULUpdate = 0
                print 'macUL %s %s\n' % (self.throughput.macULThroughput, self.throughput.macULThroughputUnit)
                self.tempfile.write('%s macUL %s %s\n' % (time.asctime(time.localtime()), self.throughput.macULThroughput, self.throughput.macULThroughputUnit))

        if (self.state == 3):
            self.tempfile.seek(0)
            plt.plot([1,2,3],[1,4,6])
            plt.savefig('test.png')
            self.state == 0
            while 1:
                try:
                    line = (self.tempfile.next())
                except:
                    break

                if 'cpuUMTS' in line:
                    line.split
                    time = 4


if __name__ == "__main__":
    guiFrame = GUIFramework()
    print dir(guiFrame)
    guiFrame._setup_parsing()
    guiFrame.state = 2
    while(1):
        guiFrame._parsing()
        guiFrame._stateMachine()
        guiFrame.update()
        time.sleep(0.1)

Upvotes: 2

Views: 765

Answers (3)

unbeknown
unbeknown

Reputation:

You try to assing to the variable time in this method:

time = 4

Therefore the compiler assumes that time must be a local variable, which isn't true. And that is the reason why you get this error when you want to use the module time, even if you try to use the module before you assign to time.

Upvotes: 2

lutz
lutz

Reputation:

You seem to use time as a variable. What happens here:

"C:\Scripts\Python\GUI.py", line 74

Upvotes: 2

u0b34a0f6ae
u0b34a0f6ae

Reputation: 49803

Why do you assign to time? You can't use it as local variable, it will overshadow the module! If you look closely it complains that you use time before you assign to it -- since to use it as a local variable in _stateMachine.

time = 4

Upvotes: 7

Related Questions