我遇到了在两个单独的类中访问全局声明的变量的问题。这是一个使用pandas进行后端支持的kivy应用程序。
以下是全局变量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'
这是我试图访问的地方,能够显示使用pandas读取的数据:
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_data
中的goto_raw_data
完全正常,raw_data
包含pandas数据帧,但在访问同一个全局变量时__init__
,它仍然初始化为原始声明中的None
。
我的init函数中是否存在阻止全局变量填充的奇怪内容?我想的可能是编译器读取类的顺序,但除此之外,我无法想到任何事情。
有没有办法解决这个问题,以便我可以访问__init__
中的全局变量,或者我坚持在定义的函数中访问。
感谢您的帮助!
答案 0 :(得分: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]
答案 1 :(得分: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
将被正确填充。
感谢所有想出让我得出这个结论的人!是时候重新格式化代码以解决这个问题了。