从另一个类调用列表实例

时间:2018-11-27 17:07:23

标签: python pyside2

我要访问在第二个窗口中基于用户选择在主窗口中创建的列表。

该列表是通过MainWindow方法在on_cc_pick中创建的。列出creditcards

在第二个窗口中,我想在CreditCardForm上访问它

当我尝试时。MainWindow.creditcardsMainWindow.creditcardsb告诉我对象没有信用卡/ b属性。

当我尝试在MainWindow类下执行全局变量时:

class MainWindow(QtWidgets.QWidget):
     creditcards = []

它始终默认为空列表。

这是我的代码,从本质上讲,我想访问在creditcardsb的类MainWindow的{​​{1}}的{​​{1}}的类def on_cc_pick(self,text):上创建的名为CreditCardForm的列表/ p>

def savecsv(self):

这些是我正在使用的导入,并非全部与我的问题有关:

class AddCreditCard(QtWidgets.QMainWindow):

    def __init__(self, parent = None):
        super(AddCreditCard, self).__init__(parent)
        creditcardform = CreditCardForm(self)
        self.setCentralWidget(creditcardform)

class CreditCardForm(QtWidgets.QWidget):

    def savecsv(self):
        **print(MainWindow.creditcardsb)**

    def __init__(self, parent):
        super(CreditCardForm, self).__init__(parent) 
        self.addname = QtWidgets.QPushButton('Save')
        self.connect(self.addname,QtCore.SIGNAL("clicked()"), self.savecsv)

class MainWindow(QtWidgets.QWidget):


    def CreateCCForm(self):
        self.addwindow.show()

    def on_cc_pick(self, text):
        NickName = []
        Account = []
        with open(refdirectory + '/' + str(text) + '.csv') as csvDataFile:
            csvReader = csv.reader(csvDataFile)
            for row in csvReader:
                NickName.append(row[0])
                Account.append(row[1])

        **creditcardsb = list(zip(NickName,Account))
        self.creditcards = creditcardsb**


    def __init__(self, parent = None):
        super(MainWindow,self).__init__(parent)
        self.pickcard = QtWidgets.QComboBox(self)
        CreditCardNames = ['cc1','cc2','cc3']

        for cc in CreditCardNames:
             self.pickcard.addItem(cc)
        self.addcard = QtWidgets.QPushButton('Add Card')
        self.pickcard.activated[str].connect(self.on_cc_pick)
        self.connect(self.addcard, QtCore.SIGNAL("clicked()"),self.CreateCCForm)

        self.addwindow = AddCreditCard(self)

1 个答案:

答案 0 :(得分:1)

请勿使用静态变量,因为要传输的属性不取决于类,而是取决于对象。因此,正确的做法是创建一种更新窗口数据的方法。此外,假设CreditCardForm始终是AddCreditCard的子代,则可以使用AddCreditCard中的parentWidget()获得CreditCardForm

import os
import csv
from PySide2 import QtCore, QtWidgets

class AddCreditCard(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(AddCreditCard, self).__init__(parent)
        creditcardform = CreditCardForm()
        self.setCentralWidget(creditcardform)
        self._creditcards = []

    def setCreditcards(self, creditcards):
        self._creditcards = creditcards

    def creditcards(self):
        return self._creditcards

class CreditCardForm(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(CreditCardForm, self).__init__(parent) 
        self.addname = QtWidgets.QPushButton('Save')
        self.addname.clicked.connect(self.savecsv)
        lay = QtWidgets.QHBoxLayout(self)
        lay.addWidget(self.addname)

    @QtCore.Slot()
    def savecsv(self):
        creditcards = self.parentWidget().creditcards()
        print(creditcards)

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent = None):
        super(MainWindow,self).__init__(parent)
        self.addwindow = AddCreditCard(self)

        self.pickcard = QtWidgets.QComboBox()
        self.pickcard.activated[str].connect(self.on_cc_pick)
        creditcardnames = ['cc1','cc2','cc3']
        self.pickcard.addItems(creditcardnames)

        self.addcard = QtWidgets.QPushButton('Add Card')
        self.addcard.clicked.connect(self.addwindow.show)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.addcard)
        lay.addWidget(self.pickcard)

    @QtCore.Slot(str)
    def on_cc_pick(self, text):
        creditcards = []
        refdirectory = ""
        filename = os.path.join(refdirectory, "{}.csv".format(text))
        with open(filename) as csvDataFile:
            csvReader = csv.reader(csvDataFile)
            for row in csvReader:
                creditcards.append((row[0], row[1]))
        self.addwindow.setCreditcards(creditcards)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
相关问题