简体   繁体   English

从另一个 class 调用 self 变量(在另一个模块中)

[英]Call self variable from another class (in another module)

I'm trying to call the varible "self.filename" in OpenFile() that takes the file path via QFileDialog (a GUI) in another module db.py, AddData() (as a varible "url =..").我试图在 OpenFile() 中调用变量“self.filename”,该变量通过另一个模块 db.py、AddData() 中的 QFileDialog(GUI)获取文件路径(作为变量“url =..”)。 How to call that self variable named self.filename in another module?如何在另一个模块中调用名为 self.filename 的 self 变量?

#main.py
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.win = uic.loadUi(r"GUI.ui",self)
        self.initUI()
        self.win.show()

    def initUI(self):
        self.win.btOpen.clicked.connect(self.OpenFile)

    def OpenFile(self):
        self.filename=QFileDialog.getOpenFileName(self,"Open File",r"C:","csv File (*.csv)")
        db.Database()

#db.py
class Database():
    def __init__(self):
        super().__init__()
        self.db = sql.connect("data.db")
        self.cur=self.db.cursor()
        self.cur.execute("CREATE TABLE IF NOT EXISTS Table (Col1 real, Col2 real);")
        self.AddData()

    def AddData(self):
        """Add raw data to database"""

        url=r"table.csv" 
        with open(url) as file:
            dr = csv.DictReader(file)
            to_db = [(i['Col1'], i['Col2']) for i in dr]
        self.cur.executemany("INSERT INTO Table (Col1, Col2) VALUES (?, ?);", to_db)
        self.db.commit()

Why don't you simply pass the filename as a parameter to your AddData method?为什么不简单地将filename作为参数传递给AddData方法? The result should look similar to this:结果应该类似于:

#main.py
class App(QMainWindow):
    def __init__(self):
        super().__init__()

        # initialize the database
        self.database = db.Database()
        #self.database.connect()  # optionally: connect to your database once in a method separate from the constructor

        self.win = uic.loadUi(r"GUI.ui",self)
        self.initUI()
        self.win.show()

    def initUI(self):
        self.win.btOpen.clicked.connect(self.OpenFile)

    def OpenFile(self):
        filename = QFileDialog.getOpenFileName(self,"Open File",r"C:","csv File (*.csv)")
        self.database.addData(filename)

#db.py
class Database():
    def __init__(self):
        super().__init__()
        self.db = sql.connect("data.db")
        self.cur = self.db.cursor()
        self.cur.execute("CREATE TABLE IF NOT EXISTS Table (Col1 real, Col2 real);")
        #self.addData()  # do not call addData here because there is no default file to load data from (at least it is not outlined in your question)

    def addData(self, filename):
        """Add raw data parsed from a csv file to this database"""

        url = filename
        with open(url) as file:
            dr = csv.DictReader(file)
            to_db = [(i['Col1'], i['Col2']) for i in dr]
        self.cur.executemany("INSERT INTO Table (Col1, Col2) VALUES (?, ?);", to_db)
        self.db.commit()

Also pay attention to consistently name your functions (camelCase).还要注意一致地命名你的函数(camelCase)。 I renamed your AddData to addData .我将您的AddData重命名为addData

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM