2009-09-01 13 views
2

私はクラスを作成していますが、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) 

答えて

7

なぜあなたはtimeに割り当てるのですか?あなたはローカル変数として使用することはできません、それはモジュールを覆い隠すでしょう!よく見ると、_stateMachineのローカル変数として使用するため、割り当てようとする前にtimeを使用しているという文句があります。

+1

おっと...(:。! が、私は少し離れて運ばれ、何とかエラーと混同しました問題である。もちろん、感謝 –

+0

@Fry:これは答えがある場合は、「受け入れる」にチェックマークをクリックしてください。あなたの質問に。 –

2

あなたは変数として時間を使用しているようです。ここで何が起こる:

"C:Pythonの\ GUI.py \ \スクリプト"、ラインあなたがこの方法で変数timeにASSINGにしてみてください74

2

time = 4 

したがって、コンパイラは、時間はローカル変数でなければならないと仮定します。これは真ではありません。これが、timeに割り当てる前にモジュールを使用しようとしても、モジュールtimeを使用するときにこのエラーが発生する理由です。

関連する問題