Как вывести текст в 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 шт):
В 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). Если вы попытаетесь передать значение другого типа, например, число или список, программа выдаст ошибку.
Вы не показали как взаимодействуют части вашего приложения.
Вам следовало показать ошибку, которую вы получаете.
Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.
НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный 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_())

