通过QFileDialog从QPlainTextEdit保存文本并创建.txt文件

问题描述 投票:0回答:1

我在保存笔记(QPlainTextEdit中的文本)时遇到麻烦。我只需要保存为txt格式。键入文本并单击按钮后,程序将显示错误“预期的字符串或类似字节的对象而不是nonetype”。记事本的程序从类fileeki开始,直到类fileush。我使用Python 3.7,PyQt5和QtDesigner创建界面,打开效果很好,但不能保存,请下载项目的所有元素。还有一些模块,您必须安装。感谢您的尝试。

import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPlainTextEdit
from PyQt5.QtWidgets import QLabel, QPushButton, QMessageBox, QFileDialog
from PyQt5.QtGui import QPixmap


class fileeki(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__()
        uic.loadUi('uineweki.ui', self)

        self.path = None

        self.pushButton.clicked.connect(self.opening_run)
        self.pushButton_2.clicked.connect(self.saving_run)
        self.pushButton_3.clicked.connect(self.saveac)
        self.pushButton_5.clicked.connect(self.new_run)

    def dialog_critical(self, s):
        dlg = QMessageBox(self)
        dlg.setText(s)
        dlg.setIcon(QMessageBox.Critical)
        dlg.show()

    def opening_run(self):
        path, _ = QFileDialog.getOpenFileName(self, "Open file", "", "Text files (*.txt)")

        if path:
            try:
                with open(path, 'rU') as f:
                    text = f.read()

            except Exception as e:
                self.dialog_critical(str(e))

            else:
                self.path = path
                self.plainTextEdit.setPlainText(text)

    def saving_run(self):
        if self.path is None:

            return self.saveac()

        self._save_to_path(self.path)

    def saveac(self):
        path = QFileDialog.getSaveFileName(self, "Save file", "", "Text files (*.txt)")

        if not path:

            return

        self._save_to_path(self.path)

    def _save_to_path(self, path):
        text = self.plainTextEdit.toPlainText()
        try:
            with open(path, 'w') as f:
                f.write(text)

        except Exception as e:
            self.dialog_critical(str(e))

        else:
            self.path = path

    def new_run(self):
        self.plainTextEdit.clear()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = fileeki()
    ex.show()
    sys.exit(app.exec())

链接到我在github上的项目:https://github.com/iMAGA07/notepadd

python pyqt pyqt5 qfiledialog qplaintextedit
1个回答
0
投票

错误是因为您实际上没有使用文件对话框中返回的数据:

    def saveac(self):
        path = QFileDialog.getSaveFileName(self, "Save file", "", "Text files (*.txt)")

        if not path:

            return

        self._save_to_path(self.path) # <-- here!

此外,getSaveFileName静态返回一个由文件路径选择的过滤器字符串组成的元组,如果取消对话框,它们都可能为空,因此if not path总是会失败。

检查返回的数据并相应地调用_save_to_path:

    def saveac(self):
        path, filter = QFileDialog.getSaveFileName(self, "Save file", "", "Text files (*.txt)")

        if not path:

            return

        self._save_to_path(path)
© www.soinside.com 2019 - 2024. All rights reserved.