You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PyQt6项目中如何配置QFileDialog实现仅打开txt格式文件

问题修正点

  • 在setupUi方法中添加主窗口实例的存储,解决QFileDialog父对象传入类型错误问题
  • 修正QFileDialog调用逻辑,使用getOpenFileName方法获取用户选中的文件路径
  • 修正实例方法调用错误,调用类内方法必须加self.前缀
  • 新增文件读取逻辑,选中txt文件后自动将内容填充到文本编辑框中
  • 删除冗余的tkinter导入

完整可运行代码

import sys
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QDialog, QApplication, QFileDialog

def Encrypt(SourceText):
    print(SourceText)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        # 存储主窗口实例,供后续文件对话框调用
        self.main_window = MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(886, 487)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.Enter = QtWidgets.QPushButton(self.centralwidget)
        self.Enter.clicked.connect(self.clicked)
        self.Enter.setObjectName("Enter")
        self.gridLayout.addWidget(self.Enter, 2, 0, 1, 1)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft)
        self.label.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.gridLayout.addWidget(self.plainTextEdit, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 886, 20))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionUpload = QtGui.QAction(MainWindow)
        self.actionUpload.setShortcutContext(
            QtCore.Qt.ShortcutContext.WindowShortcut)
        self.actionUpload.setMenuRole(QtGui.QAction.MenuRole.AboutQtRole)
        self.actionUpload.setObjectName("actionUpload")
        self.menuFile.addAction(self.actionUpload)
        self.menubar.addAction(self.menuFile.menuAction())
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.actionUpload.triggered.connect(lambda: self.Open("File Uploaded"))

    def clicked(self):
        Encrypt(self.plainTextEdit.toPlainText())

    def openFileDialog(self):
        # 获取选中的txt文件路径,_为选中的过滤器值直接忽略
        fname, _ = QFileDialog.getOpenFileName(self.main_window, 'Source Text', '', 'txt(*.txt)')
        if fname: # 过滤用户取消选择的情况
            # 如需要全局使用文件路径可存为实例属性:self.fname = fname
            # 读取文件内容填充到文本编辑框
            with open(fname, 'r', encoding='utf-8') as f:
                file_content = f.read()
            self.plainTextEdit.setPlainText(file_content)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.Enter.setText(_translate("MainWindow", "Enter"))
        self.label.setText(_translate(
            "MainWindow", "Enter Text Below Or Upload File"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.actionUpload.setText(_translate("MainWindow", "Upload"))
        self.actionUpload.setShortcut(_translate("MainWindow","Ctrl+O"))

    def Open(self, text):
        # 调用类内方法必须加self前缀
        self.openFileDialog()
        print(text)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec())

内容的提问来源于stack exchange,提问作者Derek Neilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:04