无法通过ShellExecute打开超链接失败(错误2)

时间:2018-08-31 11:27:15

标签: python python-3.x pyqt pyqt5

我有一个使用PYQT5开发的应用程序,在此应用程序中,我在QtableWidget中有一行,其中有一个指向报告的QLabel超链接。该报告保存在本地,尽管将来它可能位于网络共享中。

出于这个问题,说我在此位置的本地驱动器上有一个报告:

C:\my\report\location\report.html

但是,当我单击链接以在Web浏览器中打开报告时,在控制台窗口中出现错误:

ShellExecute 'c:%5Cmy%5Creport%5Clocation%5Creport.html' failed (error 2).

很明显,该脚本的'\'反斜杠属性存在问题,但我无法找到防止这种情况的方法。

这是我基于pyqt的代码,用于在QTableWidget中生成超链接:

reportLink = " <a href=\"{url}\"> <font face=Tw Cen MT Condensed size=2 color=black>Report</font> </a>"\
    .format(url=outcome_dict['report_location'])
report_lbl = QtWidgets.QLabel()
report_lbl.setText(reportLink)
report_lbl.setOpenExternalLinks(True)

self.ui.my_table.setCellWidget(self.row, 6, report_lbl)

这是用户单击QTableWidget中的报告超链接时的代码片段:

def html_clicked(self, mi):
    self.column = mi.column()
    if self.column == 6:
        try:
            for ref in self.ui.my_table.selectedIndexes():
                self.link = self.ui.my_table.item(int(ref.row()), 6).text()
            webbrowser.open(self.link)
        except Exception as e:
            print(e)                
    else:
        pass

1 个答案:

答案 0 :(得分:1)

没有必要使用webbrowser.open(...),QLabel将指示将存在该链接,但是为此,URL必须正确,对于本地文件,URL为file:///path/of/file,然后才能使用路径获取该网址,必须使用QUrl::fromLocalFile(),例如:

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.ui = ...
        self.ui.setupUi(self)

        d = [{"report_location": r"C:\my\report\location\report.html" },
             {"report_location": r"C:\Users\IEUser\Desktop\index.html" }]

        self.ui.my_table.setColumnCount(7)
        self.ui.my_table.setRowCount(2)

        for row, outcome_dict in enumerate(d):
            url = QtCore.QUrl.fromLocalFile(outcome_dict['report_location']).toString()
            reportLink = "<a href=\"{url}\"> <font face=Tw Cen MT Condensed size=2 color=black>Report</font> </a>"\
                        .format(url=url)
            report_lbl = QtWidgets.QLabel()
            report_lbl.setText(reportLink)
            report_lbl.setOpenExternalLinks(True)
            self.ui.my_table.setCellWidget(row, 6, report_lbl)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())