PyQt5 open_file方法打开图片时报tuple类型错误如何解决
错误产生原因
PyQt5的QFileDialog.getOpenFileName()接口返回值是长度为2的元组,并非单个文件路径字符串:
- 元组第1位:用户选中的文件绝对路径(字符串类型)
- 元组第2位:对话框当前选中的文件过滤规则(字符串类型)
原代码直接把整个元组作为路径参数传给内置的open()函数,而open()要求路径参数必须是字符串、字节或者路径对象,因此触发类型不匹配错误。
除此之外原代码还有两处会引发运行异常的问题:
- 以
rb二进制只读模式打开文件时,不能传入encoding参数,二进制读写模式不涉及编码转换,传入该参数会直接抛出参数错误 - 该方法原本是为读取文本文件设计,直接读取图片二进制内容后塞入文本编辑控件没有实际意义,图片需要用Qt的图像类加载后才能正常展示。
修复方法
- 对
getOpenFileName()的返回值做解包,只取文件路径位作为open()的入参,同时增加空路径判断,处理用户点击「取消」关闭文件选择框的场景 - 修正文件打开模式:读取文本文件时用
r文本模式,保留utf-8编码参数 - 如果需要支持打开图片,单独增加图片格式判断分支,用
QPixmap加载图片后通过对应图像控件展示,不要走文本读取逻辑
修复后的文本打开功能代码:
def open_file(self): # 解包返回值,分别拿到文件路径和选中的过滤器 file_path, selected_filter = QFileDialog.getOpenFileName(self, 'Open File') # 用户取消选择时直接返回,不执行后续逻辑 if not file_path: return self.editor() # 文本模式打开文件,指定utf-8编码 with open(file_path, 'r', encoding='utf8') as f: content = f.read() self.textEdit.setText(content)
如果需要增加图片打开支持,可以参考如下扩展逻辑:
import os from PyQt5.QtGui import QPixmap def open_file(self): file_path, selected_filter = QFileDialog.getOpenFileName(self, 'Open File') if not file_path: return self.editor() file_suffix = os.path.splitext(file_path)[1].lower() # 匹配常见图片格式 if file_suffix in ('.png', '.jpg', '.jpeg', '.bmp', '.gif'): img = QPixmap(file_path) # 用专门的图像标签控件展示图片,QTextEdit不能直接通过setText加载二进制图片数据 # self.image_label.setPixmap(img) else: # 非图片文件走文本读取逻辑 with open(file_path, 'r', encoding='utf8') as f: content = f.read() self.textEdit.setText(content)
提示:如果要在
QTextEdit中插入图片,需要通过QTextCursor插入图像资源,不能直接将读取到的二进制数据传入setText()方法。
内容的提问来源于stack exchange,提问作者Can Secgin
相关产品推荐
相关产品推荐

