Я пишу простое графическое приложение для карточек.Пользователь генерирует флэш-карты, и они сохраняются в список.Я хочу сохранить только список в файл, чтобы пользователь мог иметь несколько колод и просто Файл-> открыть, что они хотят.В моем необразованном мозгу я чувствую, что сохранение их в файле python сделает весь процесс проще, если предположить, что я сделал что-то вроде следующего при загрузке:
for c in filename.allCards:
allCards.append(c)
Я пытался использовать оба
name.setNameFilters(["*.py"])
и
name.selectNameFilter("Python Files (*.py)")
без удачи.Так что теперь у меня есть два основных вопроса.1) это самый эффективный способ сделать это и 2) если да, то чего мне не хватает, потому что даже когда я сохраняю после добавления расширения .py вручную, он все равно сохраняется как текстовый файл?
для справки здесьмоя функция сохранения
def saveFunc(self):
name = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File',"Python Files (*.py)")
name.setNameFilters(["*.py"])
name.selectNameFilter("Python Files (*.py)")
file = open(name, 'w')
, которую я вызываю в главном окне через действие меню.
Вот весь сценарий
import os
import sys
from PyQt5.QtWidgets import * #QApplication, QWidget, QPushButton
from PyQt5.QtGui import* # QIcon
from PyQt5.QtCore import pyqtSlot
from PyQt5 import QtWidgets, QtCore
import cards
from PyQt5.Qt import QPlainTextEdit
from PyQt5.uic.Compiler.qtproxies import QtGui
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'Flash Cards'
self.left = 10
self.top = 10
self.width = 640
self.height = 480
self.initUI()
def initUI(self):
self.allCards = []
self.cardShow = 0
self.backShow = 0
self.setWindowTitle(self.title)
self.windowApp = self.frameGeometry()
self.screenRes = app.desktop().screenGeometry()
centerPoint = QDesktopWidget().availableGeometry().center()
self.windowApp.moveCenter(centerPoint)
self.move(self.windowApp.topLeft())
self.setFixedSize((self.screenRes.width() / 2.5),(self.screenRes.height() /2.25))
#text displays
self.l1 = QPlainTextEdit(self)
self.l1.move(500,30)#60,200)
self.l1.resize(200,200)
self.l1.insertPlainText('Fronts of cards will be displayed here')
self.l1.setReadOnly(True)
self.l2 = QPlainTextEdit(self)
self.l2.move(500,250)
self.l2.resize(200,200)
self.l2.setReadOnly(True)
#textboxes
self.frontText = QLineEdit(self)
self.frontText.move(20,30)
self.frontText.resize(280,40)
self.frontText.setText('Front of card')
self.backText = QLineEdit(self)
self.backText.move(20,80)
self.backText.resize(280,40)
self.backText.setText('Back of card')
#buttons
self.addCard = QPushButton('Add Card', self)
self.addCard.setToolTip('Add a flash card')
self.addCard.move(110,130)
self.addCard.clicked.connect(self.on_click)
self.nextCard = QPushButton('Next Card', self)
self.nextCard.move(110,250)
self.nextCard.clicked.connect(self.next_click)
self.revealAns = QPushButton('Reveal answer', self)
self.revealAns.move(110,300)
self.revealAns.clicked.connect(self.ans_click)
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint)
exitAct = QAction(QIcon('exit.png'), '&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
exitAct.triggered.connect(qApp.quit)
saveAct = QAction(QIcon('exit.png'), '&Save', self)
saveAct.setShortcut('Ctrl+S')
saveAct.setStatusTip('Save Current Deck')
saveAct.triggered.connect(self.saveFunc)
openAct = QAction(QIcon('exit.png'), '&Open', self)
openAct.setShortcut('Ctrl+O')
openAct.setStatusTip('Open A Deck')
openAct.triggered.connect(self.openFunc)
self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
fileMenu.addAction(openAct)
fileMenu.addAction(saveAct)
self.show()
@pyqtSlot()
def on_click(self):
newCard = cards.Card(self.frontText.text(), self.backText.text())
self.allCards.append(newCard)
self.frontText.setText('Front of card')
self.backText.setText('Back of card')
def next_click(self):
if self.cardShow == self.backShow:
sameShow = True
if self.backShow >= len(self.allCards):
self.backShow = 0
if self.cardShow >= len(self.allCards):
self.cardShow = 0
if len(self.allCards) > 0 & sameShow:
self.l1.clear()
self.l1.insertPlainText(self.allCards[self.cardShow].frontSide)
self.l2.clear()
QtWidgets.qApp.processEvents()
elif len(self.allCards) == 0:
self.l1.clear()
self.l1.insertPlainText('Fronts of cards will be displayed here')
QMessageBox.about(self, 'Try Again', "You haven't added any cards")
def ans_click(self):
#self.l2.clear()
self.l2.insertPlainText(self.allCards[self.backShow].backSide)
self.backShow+=1
self.cardShow+=1
#def last_click(self):
def saveFunc(self):
name = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File',"Python Files (*.py)")
name.setNameFilters(["*.py"])
name.selectNameFilter("Python Files (*.py)")
file = open(name, 'w')
#write the list
def openFunc(self):
name = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File')
file = open(name, 'r')
with file:
deck = file.read()
self.allCards.append(file.allCards)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
карты - это сценарий, который я использовалпросто написать класс для моей карты объекта.это просто:
class Card:
def __init__(self, frontSide, backSide):
self.frontSide = frontSide
self.backSide = backSide