Как вывести текст в QTextBrowser, чтобы приложение не слетало?

Суть приложения: поиск рецептов по ингредиентам.
Набросала интерфейс в Qt Designer. Не понимаю как вывести текст в QTextBrowser (у меня переменная recPrint).

Пробовала команды .append(), .setText(), .insertPlainText() для вывода текста, который я помещаю в список при парсинге сайта.
Но при нажатии на кнопку PushButton, почему-то приложение слетает.

Вот часть программы с парсингом и функцией вывода:

import requests
from bs4 import BeautifulSoup

url='https://www.russianfood.com/recipes/bytype/?fid=99&&ysclid=lpoeqyhssm204386307'
page=requests.get(url)
ingr = []
recipes = []
soup = BeautifulSoup(page.text, "html.parser")
recipes = soup.findAll('div', class_='recipe_l in_seen v2')
for data in recipes:
        if data.find('div', class_='ingr_str') is not None:
                ingr.append(data.text)        #собираю данные с сайта в массив
  

def textRecipe(self):          #функция для вывода текста
        for data in ingr:
                if ingredient in ingr:
                        self.recPrint.insertPlainText(data)    #тут вылетает программа

Эта часть сгенерировалась сама, но я добавила ingredient = font - присваивание переменной текста из поисковой строки QLineEdit(у меня это переменная searchLine) и событие(вывод текста) при нажатии на кнопку QPushButton(переменная findBut) - .clicked.connect(textRecipe):

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(552, 747)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 551, 751))
        self.frame.setStyleSheet("background-color: rgb(232, 222, 232);\n"
"background-color: rgb(255, 192, 225);")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.frame_2 = QtWidgets.QFrame(self.frame)
        self.frame_2.setGeometry(QtCore.QRect(0, 0, 551, 80))
        self.frame_2.setStyleSheet("background-color: rgb(146, 136, 152);")
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.findBut = QtWidgets.QPushButton(self.frame_2)
        self.findBut.setGeometry(QtCore.QRect(430, 20, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.findBut.setFont(font)
        self.findBut.setStyleSheet("QPushButton{\n"
"    border-radius: 20px;\n"
"    font: 75 16pt \"Cooper Black\";\n"
"    background-color: rgb(255, 192, 225);\n"
"}\n"
"QPushButton:hover{\n"
"    \n"
"    background-color: rgb(255, 165, 206);\n"
"}")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../../../Downloads/free-icon-magnifier-2311526.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.findBut.setIcon(icon)
        self.findBut.setObjectName("findBut")
        self.searchLine = QtWidgets.QLineEdit(self.frame_2)
        self.searchLine.setGeometry(QtCore.QRect(10, 20, 401, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        font.setStrikeOut(False)
        self.searchLine.setFont(font)
        ingredient = font                      #переменная для текста в поисковой строке
        self.searchLine.setStyleSheet("QLineEdit {\n"
"    border: 2px solid rgb(187, 174, 194);\n"
"    border-radius: 20px;\n"
"    color:#FFF;\n"
"    padding-left: 20px;\n"
"    padding-right: 20px;\n"
"    background-color: rgb(121, 113, 126);\n"
"}\n"
"QLineEdit:hover{\n"
"    border: 3px solid rgb(185, 175, 199);\n"
"}\n"
"QLineEdit:focus{\n"
"    border: 3px solid rgb(255, 178, 222);\n"
"    background-color: rgb(109, 102, 120);\n"
"}")
        self.searchLine.setObjectName("searchLine")
        self.recPrint = QtWidgets.QTextBrowser(self.frame)
        self.recPrint.setGeometry(QtCore.QRect(15, 91, 521, 641))
        self.recPrint.setStyleSheet("background-color: rgb(250, 245, 250);\n"
"border-radius: 10px;")
        self.recPrint.setObjectName("recPrint")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.findBut.setText(_translate("MainWindow", "Найти"))
        self.searchLine.setPlaceholderText(_translate("MainWindow", "Введите ингредиенты"))
        self.findBut.clicked.connect(textRecipe)                 #событие при нажатие на кнопку найти

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

интерфейс приложения

Помогите пожалуйста...


Ответы (2 шт):

Автор решения: Armen Legran

В PyQt5, вы можете использовать метод append() для вывода текста в QTextBrowser. Вот пример:

from PyQt5.QtWidgets import QApplication, QTextBrowser

app = QApplication([])
textBrowser = QTextBrowser()
textBrowser.append("Ваш текст")
textBrowser.show()
app.exec_()

В этом примере, строка “Ваш текст” будет выведена в QTextBrowser. Если у вас есть переменная, содержащая текст, вы можете передать её в метод append(), как показано ниже:

my_text = "Привет, мир!"
textBrowser.append(my_text)
  • Значение, передаваемое в метод append(), должно быть строкой (тип str в Python). Если вы попытаетесь передать значение другого типа, например, число или список, программа выдаст ошибку.
→ Ссылка
Автор решения: S. Nick

Вы не показали как взаимодействуют части вашего приложения.

Вам следовало показать ошибку, которую вы получаете.

Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

Ваша задача может выглядеть примерно так:

import requests
from bs4 import BeautifulSoup
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(550, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        
        self.centralwidget.setStyleSheet("background-color: rgb(255, 192, 225);")

# по-моему виджет self.frame лишний
        '''
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 551, 651))
        self.frame.setStyleSheet("background-color: rgb(232, 222, 232);\n"
            "background-color: rgb(255, 192, 225);")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        '''
        
        self.frame_2 = QtWidgets.QFrame(MainWindow)          #(self.frame)
        self.frame_2.setGeometry(QtCore.QRect(0, 0, 551, 80))
        self.frame_2.setStyleSheet("background-color: rgb(146, 136, 152);"
"    border-radius: 10px;\n"
        )
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        
        self.findBut = QtWidgets.QPushButton(self.frame_2)
        self.findBut.setGeometry(QtCore.QRect(430, 20, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.findBut.setFont(font)
        self.findBut.setStyleSheet("QPushButton{\n"
"    border-radius: 10px;\n"
"    font: 75 16pt \"Cooper Black\";\n"
"    background-color: rgb(255, 192, 225);\n"
"}\n"
"QPushButton:hover{\n"
"    \n"
"    background-color: rgb(255, 165, 206);\n"
"}")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("Ok.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.findBut.setIcon(icon)
        self.findBut.setObjectName("findBut")
        self.searchLine = QtWidgets.QLineEdit(self.frame_2)
        self.searchLine.setGeometry(QtCore.QRect(10, 20, 401, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        font.setStrikeOut(False)
        self.searchLine.setFont(font)
        
# ?      ingredient = font                      #переменная для текста в поисковой строке

        self.searchLine.setStyleSheet("QLineEdit {\n"
"    border: 2px solid rgb(187, 174, 194);\n"
"    border-radius: 10px;\n"
"    color:#FFF;\n"
"    padding-left: 20px;\n"
"    padding-right: 20px;\n"
"    background-color: rgb(121, 113, 126);\n"
"}\n"
"QLineEdit:hover{\n"
"    border: 3px solid rgb(185, 175, 199);\n"
"}\n"
"QLineEdit:focus{\n"
"    border: 3px solid rgb(255, 178, 222);\n"
"    background-color: rgb(109, 102, 120);\n"
"}")
        self.searchLine.setObjectName("searchLine")
        self.recPrint = QtWidgets.QTextBrowser(MainWindow)          #(self.frame)
        self.recPrint.setGeometry(QtCore.QRect(15, 91, 521, 641))
        self.recPrint.setStyleSheet("background-color: rgb(250, 245, 250);\n"
"border-radius: 10px;")
        self.recPrint.setObjectName("recPrint")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.findBut.setText(_translate("MainWindow", "Найти"))
        self.searchLine.setPlaceholderText(_translate("MainWindow", "Введите ингредиенты"))

#        self.findBut.clicked.connect(textRecipe)      #событие при нажатие на кнопку найти


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)

        layoutH = QtWidgets.QHBoxLayout(self.frame_2)
        layoutH.addWidget(self.searchLine)
        layoutH.addWidget(self.findBut)
        
        layout = QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.frame_2)
        layout.addWidget(self.recPrint)

        # событие при нажатие на кнопку найти         
        self.findBut.clicked.connect(self.textRecipe)      

# я не знаю куда вы хотите вставить выборку и как часто ее запускать
        url='https://www.russianfood.com/recipes/bytype/?fid=99&&ysclid=lpoeqyhssm204386307'
        page = requests.get(url)
        self.ingr = []                                                # !!! +++ self.
        recipes = []
        soup = BeautifulSoup(page.text, "html.parser")
        recipes = soup.findAll('div', class_='recipe_l in_seen v2')
        for data in recipes:
            if data.find('div', class_='ingr_str') is not None:
                self.ingr.append(data.text.strip())   # собираю данные с сайта в массив

    def textRecipe(self):
        if not self.searchLine.text():
            self.recPrint.moveCursor(QtGui.QTextCursor.Start)
            self.recPrint.insertHtml(
                '<b style="font-size: 22px; color: red">Введите ингредиенты !!!</b> <br><br>')
            return
        self.recPrint.clear()

        for data in self.ingr:
#            if ingredient in ingr:
            if self.searchLine.text() in data:
                self.recPrint.insertPlainText(data)    

        if not self.recPrint.toPlainText():
            self.recPrint.moveCursor(QtGui.QTextCursor.Start)
            self.recPrint.insertHtml(
                f'<b style="font-size: 22px; color: red">Нет рецептов по ингредиенту {self.searchLine.text()}!</b> <br><br>')
            
    
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка