Как отобразить результаты вывода программы в гиперссылочном формате в Python3 / PyQt5? - PullRequest
0 голосов
/ 06 марта 2020

Выполняю некоторую операцию текстового поиска в файлах. Вывод отобразит строки, если он содержит текст, введенный для поиска. Я закончил код до этого. Теперь я хочу отобразить эти выходные строки в каком-то виджете, эти строки должны быть гиперссылками, когда мы щелкаем по выходной строке, он открывает файл с этим текстом. Строка также может содержать простой текст или некоторый код HTML, который я хочу отобразить как есть, например: если мы ищем «table. jsp», а содержимое строки выглядит следующим образом, которое доступно в A.txt :

<a href=\"JavaScript:tableClick('../table.jsp?id="+ RevId +"', '')>Link</a>

тогда вывод в виджете должен быть как есть:

<a href=\"JavaScript:tableClick('../table.jsp?id="+ RevId +"', '')>Link</a>

НЕ :

Ссылка

Теперь, когда вы нажмете <a href=\"JavaScript:tableClick('../table.jsp?id="+ RevId +"', '')>Link</a>, откроется файл A.txt.

Как мы можем добиться этого в PyQt5 или с помощью любого другого GUI в Python3? Я попытался отобразить выходные данные в QLabel (PyQt5), но вывод для HTML выглядит так:

Link

1 Ответ

1 голос
/ 06 марта 2020

Вот возможный способ добиться этого. Вы можете заменить видимую текстовую часть кода HTML всей ссылкой, заменив специальные символы < > " их HTML escape-строками &lt; &gt; &quot;. Например, текст <a href="file:file1.txt">Link</a> становится:

<a href="file:file1.txt">&lt;a href=&quot;file:file1.txt&quot;&gt;Link&lt;/a&gt;</a>

Когда вы вызываете setOpenExternalLinks(True) на QLabel, он открывает ссылки с приложением по умолчанию, используя QDesktopServices.openUrl(). В приведенном ниже случае у меня есть файл с именем file1.txt, и когда я нажимаю на QLabel, он открывает файл в приложении, который будет выбран, если я дважды щелкну по файлу.

import sys, re
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class LinkLabel(QLabel):

    def __init__(self, text, *args, **kwargs):
        super().__init__(*args, **kwargs)
        visible = text.replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;')
        i, j = re.search('>(.*)<', text).span()
        self.setText(text[:i+1] + visible + text[j-1:])
        self.setOpenExternalLinks(True)


class Template(QWidget):

    def __init__(self):
        super().__init__()
        vbox = QVBoxLayout(self)
        vbox.addWidget(LinkLabel('<a href="file:file1.txt">Link</a>'))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Template()
    gui.show()
    sys.exit(app.exec_())

Это выглядит так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...