Вывод текста в окно PyQt5
Я пишу приложение на PyQt5 и вот в чем проблема. Я хочу в оконном приложении отобразить текст, который уже есть в программе.
Но я не могу его вывести на экран.
При этом я нашел пример, который оказался рабочим, но при интеграции этого примера в мой код ничего не происходит.
Вот рабочий пример: https://doc.qt.io/qtforpython-5/quickstart.html
Вот мой код:
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QLabel,
QVBoxLayout
from PyQt5.QtGui import QIcon
import sys
class Program(QMainWindow, QWidget):
def __init__(self):
super().__init__()
self.windoww = QMainWindow()
self.windoww.setObjectName("MainWindow")
self.windoww.resize(1000, 561)
self.button_create = QPushButton('Button', self.windoww)
self.button_settings = QPushButton('Button', self.windoww)
self.button_about = QPushButton('Button', self.windoww)
self.text = QLabel("Hello World",
# alignment=QtCore.Qt.AlignCenter
)
self.layoutt = QVBoxLayout()
self.layoutt.addWidget(self.text)
self.setLayout(self.layoutt)
self.button_about.setStyleSheet('''QPushButton {
background-image : url(images/Rectangle 9.png);
border-style: outset;
border-radius: 10px;
border-color: beige;
font: bold 14px;
min-width: 10em;
padding: 6px;
}''')
self.button_create.move(430, 245)
self.button_settings.move(430, 330)
self.button_about.setGeometry(170, 421, 260, 65)
# self.button_about.move(430, 400)
self.button_about.clicked.connect(lambda: [
self.clean_data([self.button_create,
self.button_settings,
self.button_about]),
self.about_program()
])
self.initUI("images/Frame 1.png")
def about_program(self):
self.layoutt = QVBoxLayout()
self.label_4 = QLabel()
self.label_4.setText(
'В одном из приведённых ниже слов допущена ошибка в \nпост'
'ановке ударения: НЕВЕРНО выделена буква, \nобозначающая '
'ударный гласный звук. Выпишите это слово.')
self.layoutt.addWidget(self.label_4)
self.setLayout(self.layoutt)
# self.text = "Данно приложение предназначено для создания магического квадрата в разных вариациях. \
# Запомните, программа способна создать квадрат только из положительных целых чисел. Аналогов \
# данной программы нет, поэтому пользуйтесь, дорогие уроды =)"
# self.panel.move(430, 245)
def initUI(self, path):
self.windoww.setStyleSheet("#MainWindow{border-image:url("f'{path}'")}")
self.windoww.setWindowTitle('Icon')
self.windoww.setWindowIcon(QIcon('web.png'))
self.windoww.show()
def clean_data(self, *args):
for arg in args:
for object_name in arg:
object_name.deleteLater()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Program()
sys.exit(app.exec_())
Текст, который хочу вывести находится в методе about_program().
Надеюсь вы сможете помочь.
Ответы (1 шт):
Вам надо определиться, какой виджет для главного окна использовать.
QMainWindow наследуется от QWidget, но он немного сложнее.
Вам надо хорошенько познакомиться с Qt Main Window Framework, прежде чем его использовать.
Вам надо глубже изучить использование менеджеров компоновки.
В вашем примере достаточно одного QGridLayout.
В вашем код ничего не происходит, потому что вы накрываете
объектом self.text ваши кнопки,
для которых вы зачем-то решили использовать абсолютное позиционирование.
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, \
QPushButton, QLabel, QVBoxLayout, QGridLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
# --------- или -> vvvvvvvvvvv vvvvvvv <---- или -----------------------------
# ???class Program(QMainWindow, QWidget):
class Program(QWidget):
def __init__(self):
super().__init__()
# ??? self.windoww = QMainWindow()
self.setObjectName("mainwindow") # +++
self.button_create = QPushButton('button_create')
self.button_create.setObjectName("button_create")
self.button_settings = QPushButton('button_settings')
self.button_settings.setObjectName("button_settings")
self.button_about = QPushButton()
self.button_about.setObjectName("button_about") # +++
self.button_about.clicked.connect(self.about_program) # +++
''' ----> я не понимаю что это
self.button_about.clicked.connect(lambda: [
self.clean_data([self.button_create,
self.button_settings,
self.button_about]),
self.about_program()
])
'''
# ---------> vvvvv <--------------------------------------------------------------
self.label = QLabel("Hello World", alignment=Qt.AlignCenter)
self.label.setObjectName("label")
# self.layoutt = QVBoxLayout()
# self.setLayout(self.layoutt)
self.layout = QGridLayout(self) # +++ QGridLayout
self.layout.addWidget(self.label, 0, 0, 5, 5)
self.layout.addWidget(self.button_create, 1, 5)
self.layout.addWidget(self.button_settings, 3, 5)
self.layout.addWidget(self.button_about, 6, 1, 1, 3)
def about_program(self):
# ??? self.layoutt = QVBoxLayout()
# ??? self.label_4 = QLabel()
# ??? self.label_4.setText(
# ---------> vvvvv <--------------------------------------------------------------
self.label.setText(
'В одном из приведённых ниже слов допущена ошибка в \nпост'
'ановке ударения: НЕВЕРНО выделена буква, \nобозначающая '
'ударный гласный звук. Выпишите это слово.')
# ??? self.layout.addWidget(self.label_4)
# ??? self.setLayout(self.layout)
''' ----> я не понимаю что это
def clean_data(self, *args):
for arg in args:
for object_name in arg:
object_name.deleteLater()
'''
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv !!! +++
QSS = '''
#mainwindow {
background-color: #a1193d;
}
#label {
background-color: #105652;
color: #fff;
font-size: 24px;
}
#button_about {
image: url(boy33.png);
background-color: #333312;
min-height: 10em;
}
#button_about:hover {
background-color: #565612;
}
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(QSS) # <---- !!! +++
ex = Program()
ex.resize(1000, 561)
ex.setWindowTitle('Icon')
ex.setWindowIcon(QIcon('im.png')) # <---- web.png
ex.show()
sys.exit(app.exec_())
boy33.png
Update:
... мне нужно чтобы была возможность использовать новый задний фон, который у меня в картинках, при нажатии на кнопку, а в вашем примере он будет постоянный. ...
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, \
QPushButton, QLabel, QVBoxLayout, QGridLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class Program(QWidget):
def __init__(self):
super().__init__()
self.setObjectName("mainwindow")
self.widget = QWidget(self) # +++
self.widget.setObjectName("widget") # +++
self.button_create = QPushButton('button_create')
self.button_create.setObjectName("button_create")
self.button_settings = QPushButton('button_settings')
self.button_settings.setObjectName("button_settings")
self.button_about = QPushButton()
self.button_about.setObjectName("button_about")
self.button_about.clicked.connect(self.about_program)
self.label = QLabel("Hello World", alignment=Qt.AlignCenter)
self.label.setObjectName("label")
self.layout = QGridLayout(self.widget) # !!!
self.layout.addWidget(self.label, 0, 0, 5, 5)
self.layout.addWidget(self.button_create, 1, 5)
self.layout.addWidget(self.button_settings, 3, 5)
self.layout.addWidget(self.button_about, 6, 1, 1, 3)
main_layout = QVBoxLayout(self) # !!!
main_layout.addWidget(self.widget) # !!!
def about_program(self):
self.label.setText(
'В одном из приведённых ниже слов допущена ошибка в \nпост'
'ановке ударения: НЕВЕРНО выделена буква, \nобозначающая '
'ударный гласный звук. Выпишите это слово.')
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.setStyleSheet('''
#widget {
border-image: url("opencv_color.jpg") 0 0 0 0;
}
#label {
color: #fff;
}
''')
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
QSS = '''
#mainwindow {
background-color: #a1193d;
}
#label {
color: #f00;
font-size: 24px;
}
#button_about {
image: url(boy33.png);
background-color: transparent;
min-height: 10em;
}
#widget {
border-image: url("boy33.png") 0 0 0 0;
}
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(QSS)
ex = Program()
ex.resize(1000, 561)
ex.setWindowTitle('Icon')
ex.setWindowIcon(QIcon('im.png'))
ex.show()
sys.exit(app.exec_())




