2017-06-21 42 views
-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類,訪問global raw_datagoto_raw_data運行完美,raw_data包含熊貓數據框,但在訪問__init__中的同一全局變量時,它仍然初始化爲None,因爲它在原始聲明中。

在init函數中是否有一些奇怪的事情阻止了全局變量的填充?我想也許是編譯器讀取類的順序,但除此之外我什麼也想不到。

是否有解決方法,以便我可以訪問__init__中的全局變量,或者我堅持訪問定義的函數。

感謝您的幫助!

+0

」對於縮進錯誤感到抱歉,我無法弄清楚如何正確格式化。「 - 將代碼複製粘貼到問題中,然後突出顯示您粘貼的所有內容(包括在預覽中顯示代碼格式的部分以及不顯示的部分),然後按Ctrl-K或帶有大括號的按鈕。 – user2357112

+0

爲了更容易幫助您,您應該提供[mcve]。閱讀大量的代碼頁面很可能會嚇跑試圖提供幫助的人。 –

+1

如果'__init__'中'raw_data'仍然是'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將正確填充。

感謝所有爲了讓我得出這個結論的人!現在需要重新格式化代碼以解決此問題。 「