python - 从另一个类调用列表实例

标签 python pyside2

我想在第二个窗口上访问根据用户选择在主窗口上创建的列表。

该列表创建于 MainWindowon_cc_pick方法。列表 creditcards .

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

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

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

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

它始终默认为空列表。

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

最佳答案

不要使用静态变量,因为您要传输的属性不取决于类,而是取决于对象。所以正确的做法是创建一个更新窗口数据的方法。此外,假设 CreditCardForm 始终是 AddCreditCard 的子级,您可以使用 parentWidget() 获取 AddCreditCard来自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_())

关于python - 从另一个类调用列表实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53504729/

相关文章:

python - SublimeREPL 无法识别 python 库

python - 使用 python GTK3 获取 DrawArea 中的鼠标滚轮事件

python - 尝试让 QProcess 使用队列

python - 取消选中 PyQt5/PySide2 中所有其他复选框的一个复选框

python - 列表理解和交集问题

Python 和 Selenium - 重新启动程序并重用相同的浏览器 session

python - 将 mssql 空间字段导入 geopandas/shapely 几何图形

python - Pyside2 我怎样才能移动盒子?

python - Python 列表更新时更新 ListView

python - 如何在 QTableWidget 中将 bool 项显示为复选框?