从另一个类调用列表实例

2024-09-23 06:34:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想访问基于用户选择在我的主窗口上创建的列表,在我的第二个窗口上。你知道吗

列表是在MainWindowon_cc_pick方法下创建的。列出creditcards。你知道吗

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

当我尝试MainWindow.creditcardsMainWindow.creditcardsb时,它告诉我对象没有属性creditcards/b

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

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

它总是默认为空列表。你知道吗

这是我的代码,本质上我想访问名为creditcardsb的列表,该列表创建于MainWindow类的def on_cc_pick(self,text):类的CreditCardForm类的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)

这些是我正在使用的导入,并非都与我的问题相关:

from subprocess import Popen
from selenium import webdriver
from bs4 import BeautifulSoup
import string
import time
import random
import csv
import pandas as pd
from pick import pick
import requests
import re
import urllib.request
from urllib.request import urlopen
from selenium.webdriver.common.by import By
from tkinter import *
import tkinter as tk
import tkinter.filedialog as filedialog
import os
import pyodbc
from decimal import *
import sys
from PySide2 import QtCore, QtGui, QtWidgets
from datetime import datetime, date
from decimal import Decimal

Tags: fromimportself列表initondefparent
1条回答
网友
1楼 · 发布于 2024-09-23 06:34:01

不要使用静态变量,因为要传输的属性不依赖于类,而是依赖于对象。所以正确的方法是创建一个更新窗口数据的方法。此外,假设CreditCardForm始终是AddCreditCard的子级,您可以使用parentWidget()CreditCardForm获得AddCreditCard。你知道吗

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_())

相关问题 更多 >