Почему пространство имен после вызова метода изменяется? - PullRequest
2 голосов
/ 01 сентября 2009

Я создаю класс, но у меня возникли проблемы с пространством имен в python.

Вы можете увидеть код ниже, и он в основном работает нормально, но после вызова guiFrame._stateMachine() модуль времени больше не определен.

Если я повторно импортирую модуль времени в _stateMachine(), он работает. Но почему модуль времени не находится в пространстве имен, когда я импортирую его в заголовок?

Я что-то упустил?

Сообщение об ошибке:

  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

код:

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)

Ответы [ 3 ]

7 голосов
/ 01 сентября 2009

Почему вы назначаете time? Вы не можете использовать его как локальную переменную, это затмит модуль! Если вы присмотритесь, он будет жаловаться на то, что вы используете time перед тем, как назначить его - поскольку он используется в качестве локальной переменной в _stateMachine.

time = 4
2 голосов
/ 01 сентября 2009

Вы пытаетесь привязать к переменной time в этом методе:

time = 4

Поэтому компилятор предполагает, что время должно быть локальной переменной, что не соответствует действительности. Именно по этой причине вы получаете эту ошибку, когда хотите использовать модуль time, даже если вы пытаетесь использовать модуль, прежде чем назначить time.

2 голосов
/ 01 сентября 2009

Вы, кажется, используете время как переменную. Что здесь происходит:

"C: \ Scripts \ Python \ GUI.py", строка 74

...