2017-06-21 21 views
-2

2つの別々のクラスでグローバルに宣言された変数へのアクセスに問題があります。これはバックエンドのサポートのためにパンダを使用するkivyアプリケーションです。ここでPythonクラスのグローバル変数へのアクセス__init__

は、グローバル変数、raw_dataの初期化であり、それはもともと(show_raw_data FUNCに)変更された場合:私は表示できるようにアクセスしようとしていますどこ

# original dataframe 
raw_data = None 

class IntroScreen(Screen): 

    def __init__ (self, **kwargs): 
     super (IntroScreen, self).__init__(**kwargs) 

     self.preview_screen_layout.add_widget(Button(text="View Raw Data", on_release=self.goto_raw_data)) 

    # switch to preview screen and show raw data when import is clicked 
    def show_raw_data(self, *args): 
     global file_path_list 
     global raw_data 
     try: 

      # check input is correct 
      if ".xlsx" in file_path_list["orig_data"]: 
       raise ValueError 
      else: 
       # open csv file to display and display it 
       raw_data = pd.read_csv(file_path_list["orig_data"]) 
       dfgui.show(raw_data) 

       # move to next screen 
       self.manager.current = 'preview_screen' 

そしてここにはありますパンダを使用して読み込まれたデータ:

class PreviewScreen(Screen): 

    def __init__(self, **kwargs): 
     super (PreviewScreen, self).__init__(**kwargs) 

     global raw_data 
     dfgui.show(raw_data) 

    # display raw data to user 
    def goto_raw_data(self, *args): 
     global raw_data 
     dfgui.show(raw_data) 

しかし、ここでは私の問題である - PreviewScreenクラスでは、完全に罰金と goto_raw_data内で作品へのアクセスにはパンダのデータフレームが含まれていますが、__init__の同じグローバル変数にアクセスすると、元の宣言にあるように、まだNoneに初期化されます。

私のinit関数では、グローバル変数の設定を妨げている何か不思議なことがありますか?私はおそらくコンパイラがクラスを読む順序を考えていたが、それ以外は何も考えることはできない。

__init__のグローバル変数にアクセスできるようにする方法がありますか、または定義済みの関数でアクセスすることに固執しています。

ありがとうございました!

+0

"インデントエラーが発生して申し訳ありませんが、正しくフォーマットする方法を理解できませんでした。" - あなたのコードをコピーして質問に貼り付け、貼り付けたすべての部分(プレビューに書式設定されたコード部分とそうでない部分の両方)をハイライト表示し、Ctrl-Kを押すか、中カッコでボタンを押します。 – user2357112

+0

あなたの手助けをより簡単にするには、[mcve]を提供する必要があります。たくさんのコードを読まなければならないのは、助けようとしている人々を怖がらせる可能性が最も高いからです。 –

+1

'raw_data'が' __init__'の 'None'でもまだ残っていれば、おそらくそれは実際にはまだ起こっていません。結果を計算する前に結果を使用することはできません。 – user2357112

答えて

0

通過するにはあまりにも多くのコードを、しかし、私は多少あなたがそれをやろうとしているものを複製することができ、それはここで自分の質問に答える

raw_data = None 

class IntroScreen: 

def change_raw_data_value(self): 
    global raw_data 
    raw_data = 'Changed raw_data once' 

def print_raw_data(self): 
    print(raw_data) 


class PreviewScreen: 

def __init__(self): 
    global raw_data 
    print(raw_data) 

def change_raw_data_value(self): 
    global raw_data 
    raw_data = 'Changed raw_data twice' 

def print_raw_data(self): 
    print(raw_data) 

if __name__ == '__main__': 
intro_screen = IntroScreen() 
intro_screen.change_raw_data_value() 
intro_screen.print_raw_data() 

preview_screen = PreviewScreen() 
preview_screen.change_raw_data_value() 
preview_screen.print_raw_data() 

Changed raw_data once 
Changed raw_data once -> from Preview Screen __init__ 
Changed raw_data twice 
[Finished in 0.2s] 
+0

これをありがとう、私はコードを短くしました。これは私が後にしたものですが、あなたのように機能するようには見えません。お手伝いありがとう! – jGraves

+0

短いコードの方がはっきりしています。私は、プレビュー画面の初期化に先立ち、IntroScreenクラスのshow_raw_dataの内部でelse条件が実行されていると仮定しています。コードの流れは? – Satish

+0

私は、PreviewScreenがIntroScreenで発生するクリックイベントの前にインスタンス化されているため、なぜraw_dataがまだ初期化されていないのかという問題を追跡したと思います。 Kivyの仕組みは、画面が最初に初期化され、レイアウト上のクリックイベントが初期化後に発生します。 – jGraves

0

に動作します。それはプログラムがセットアップされている方法なので、解決する解決策はありません。

class OutlierDetectionApp(App): 

     def build(self): 
      # set window size and color 
      #Window.clearcolor = (1,1,1,1) 

      # initialize screen manager and create screens 
      my_screenmanager = ScreenManager() 
      intro_screen = IntroScreen(name='intro_screen') 
      preview_screen = PreviewScreen(name='preview_screen') 

      # add screens to screen manager 
      my_screenmanager.add_widget(intro_screen) 
      my_screenmanager.add_widget(preview_screen) 
      return my_screenmanager 

if __name__ == '__main__': 
    OutlierDetectionApp().run() 

したがって、PreviewScreenは、実際のファイルにraw_data設定ボタンをクリックする前に初期化されているので、データは、画面の初期化時にまだNoneある:画面はように初期化されます。自己定義されたメソッドで動作する理由は、これらのメソッド(すなわち:goto_raw_data)のロジックが実行時に評価されるため、raw_dataが正しく読み込まれるためです。

私はこの結論に来るように考えを入れてくれたすべての人に感謝します!この問題を回避するには、コードを少し再フォーマットする時間。

関連する問題