Kivy(Python):无法使用从一个文件到另一个文件的类变量

Kivy(Python):无法使用从一个文件到另一个文件的类变量,python,kivy,Python,Kivy,主文件:使用kivy filechooser,我选择了一个csv文件,抓取数据并转换成列表。(姓名和年龄) 子文件:我想使用主文件中定义的名称(x轴)和年龄(y轴)绘制图形 mainfile.py: import kivy from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder import os import csv Builder.load_file('

主文件:使用kivy filechooser,我选择了一个csv文件,抓取数据并转换成列表。(姓名和年龄) 子文件:我想使用主文件中定义的名称(x轴)和年龄(y轴)绘制图形

mainfile.py:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

import os
import csv

Builder.load_file('design2.kv')
class MyWidget(BoxLayout):
    def open(self, path, filename):
        with open(os.path.join(path, filename[0])) as f:
            csv_data = csv.reader(f)
            datalines = list(csv_data)
            names = [i[0] for i in datalines]
            age = [i[1] for i in datalines]
            print(names)
            print(age)
class MyApp(App):
    def build(self):
        return MyWidget()
if __name__ == '__main__':
    MyApp().run()
设计电压2.kv:

<MyWidget>:
    id: my_widget
    FileChooserListView:
        id: filechooser
        filters: ['*.csv']
        on_selection: my_widget.open(filechooser.path, filechooser.selection)
Im无法创建图形,因为子文件中的名称和年龄显示为未定义


请帮助我

您的
姓名
年龄
仅定义为
MyWidget
open()
方法范围内的局部变量。如果要公开它们以便在
open()
方法之外使用,则必须在全局级别定义它们。因此,您可以修改
mainfile.py
来完成以下操作:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

import os
import csv

# define names and ages to make them available for import
names = []
age = []

Builder.load_file('design2.kv')
class MyWidget(BoxLayout):
    def open(self, path, filename):
        global names, age
        with open(os.path.join(path, filename[0])) as f:
            csv_data = csv.reader(f)
            datalines = list(csv_data)
            names = [i[0] for i in datalines]
            age = [i[1] for i in datalines]
            print(names)
            print(age)
class MyApp(App):
    def build(self):
        return MyWidget()
if __name__ == '__main__':
    MyApp().run()
此外,您还需要稍微修改
子文件

from matplotlib import pyplot as plt
import mainfile
mainfile.MyWidget().open('a', 'b')  # set the values of names and age
print(mainfile.names, mainfile.age)
plt.plot(mainfile.names,mainfile.age)
plt.show()

您的
名称
年龄
仅定义为
MyWidget
open()
方法范围内的局部变量。如果要公开它们以便在
open()
方法之外使用,则必须在全局级别定义它们。因此,您可以修改
mainfile.py
来完成以下操作:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

import os
import csv

# define names and ages to make them available for import
names = []
age = []

Builder.load_file('design2.kv')
class MyWidget(BoxLayout):
    def open(self, path, filename):
        global names, age
        with open(os.path.join(path, filename[0])) as f:
            csv_data = csv.reader(f)
            datalines = list(csv_data)
            names = [i[0] for i in datalines]
            age = [i[1] for i in datalines]
            print(names)
            print(age)
class MyApp(App):
    def build(self):
        return MyWidget()
if __name__ == '__main__':
    MyApp().run()
此外,您还需要稍微修改
子文件

from matplotlib import pyplot as plt
import mainfile
mainfile.MyWidget().open('a', 'b')  # set the values of names and age
print(mainfile.names, mainfile.age)
plt.plot(mainfile.names,mainfile.age)
plt.show()

非常感谢。使用此方法,我可以导入姓名和年龄。但它将是空的列表。无法从classOops获取姓名和年龄数据,忘记了
global
语句。我已经更新了我的答案。它仍然是课堂外的空列表。在打印
子文件中
姓名
年龄
的值之前,必须执行
MyWidget
open()
方法,以便将值设置为
[]
。我还编辑了我的答案,以显示
子文件中所需的更改。谢谢!!。使用此方法,我可以导入姓名和年龄。但它将是空的列表。无法从classOops获取姓名和年龄数据,忘记了
global
语句。我已经更新了我的答案。它仍然是课堂外的空列表。在打印
子文件中
姓名
年龄
的值之前,必须执行
MyWidget
open()
方法,以便将值设置为
[]
。我还编辑了我的答案,以显示
子文件中所需的更改。