python - 从另一个类调用列表实例
问题描述
我想在我的第二个窗口上访问基于用户选择在我的主窗口上创建的列表。
该列表是在MainWindow
该on_cc_pick
方法下创建的。列表creditcards
。
在第二个窗口上,我想访问它CreditCardForm
当我尝试。MainWindow.creditcards
或者MainWindow.creditcardsb
它告诉我对象没有属性 creditcards/b。
当我尝试在 MainWindow 类下做一个全局变量时:
class MainWindow(QtWidgets.QWidget):
creditcards = []
它始终默认为空列表。
这是我的代码,本质上我想访问名为creditcardsb
created on class MainWindow
under def on_cc_pick(self,text):
on class CreditCardForm
underdef 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
,您可以AddCreditCard
使用parentWidget()
from获得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_())
推荐阅读
- c# - 同时打开url多次,如c#上的fiddler
- c++ - 编写一个从标准输入读取整数直到文件结尾的 C++ 程序
- relayjs - 如何处理 Relay Modern v6 / 实验中的嵌套路由
- angular - Angular CDK 在下拉列表之一中使用占位符拖放
- symfony - 是否可以通过@groups 重用 API 平台/Symfony 生成的模型定义?
- python-3.x - Python 3.7 自 2019 年 4 月以来的错误 Unix 时间戳
- c# - 如何在winforms网站上的生日下拉框中设置值
- html - 在角度项目上更改 svg 图标 fa-edit 的高度
- ruby-on-rails - 响应中字符串数组的Rails rspec CSV生成器错误
- asp.net - 当 rvest 不起作用时,如何使用 R 抓取 .aspx 网站?