首页 > 解决方案 > PyQt5 | 我不明白我的功能是否有效

问题描述

当您单击 toNextPage 和 toPreviousPage 按钮时,会出现一个窗口,其中的某些内容会发生变化。

我试图通过每个“页面”的功能来实现这一点。也就是说,窗口、2 个按钮和“标题”必须保留在原位。在按钮和“标题”之间有一个地方会出现功能中描述的内容。这个函数在代码中被描述为“page_1”但是当你点击调用这个函数的“toNextPage”按钮时,窗口中没有任何变化。

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_FirstTheme(object):
    def setupUi(self, FirstTheme):
        FirstTheme.setObjectName("FirstTheme")
        FirstTheme.resize(600, 700)
        FirstTheme.setMinimumSize(QtCore.QSize(600, 700))
        FirstTheme.setMaximumSize(QtCore.QSize(600, 700))
        icon = QtGui.QIcon.fromTheme("icon.ico")
        FirstTheme.setWindowIcon(icon)
        FirstTheme.setStyleSheet("background-color: #070506;\n"
"color: grey;\n"
"")
        self.centralwidget = QtWidgets.QWidget(FirstTheme)
        self.centralwidget.setObjectName("centralwidget")
        FirstTheme.setCentralWidget(self.centralwidget)
        QtCore.QMetaObject.connectSlotsByName(FirstTheme)
        FirstTheme.setWindowTitle("1.Знайомство з Python")
        #This is variable with number of page
        self.pagination = 1



#This is image (space) where situated the topic of theme 
        self.header = QtWidgets.QLabel(self.centralwidget)
        self.header.setGeometry(QtCore.QRect(0, 0, 600, 103))
        self.header.setStyleSheet("image: url(:/images/bg-header.jpg)")
        self.header.setText("")
        self.header.setObjectName("header")


#This is topic of the theme.
        self.ThemeName = QtWidgets.QLabel(self.centralwidget)
        self.ThemeName.setGeometry(QtCore.QRect(39, 21, 522, 60))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.ThemeName.setFont(font)
        self.ThemeName.setStyleSheet("QLabel#ThemeName\n"
"{\n"
"color: #fed346;\n"
"background:none;\n"
"}")
        self.ThemeName.setObjectName("ThemeName")
        self.ThemeName.setText("1.Знайомство з мовою програмування\n"
"                           Python")


#This is pushbutton. She may change the text and images on widget to Next theme
        self.toNextTheme = QtWidgets.QPushButton(self.centralwidget)
        self.toNextTheme.setGeometry(QtCore.QRect(310, 662, 100, 25))
#This is font settings for text of this pushButton
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setBold(True)
        font.setWeight(75)
        self.toNextTheme.setFont(font)
#This is css for NextPuchButton
        self.toNextTheme.setStyleSheet("QPushButton#toNextTheme\n"
"{\n"
"   background-color: #225765;\n"
"color: #fed346;\n"
"border-top-right-radius: 5px;\n"
"border-bottom-right-radius: 5px;\n"
"}\n"
"\n"
"QPushButton:hover#toNextTheme\n"
"{\n"
"    background-color: #3674a5;\n"
"}")
        self.toNextTheme.setObjectName("toNextTheme")
        self.toNextTheme.setText("Далі")



#This is pushButton. She is change the text on widget to previous theme
        self.toPreviousTheme = QtWidgets.QPushButton(self.centralwidget)
        self.toPreviousTheme.setEnabled(True)
        self.toPreviousTheme.setGeometry(QtCore.QRect(190, 662, 100, 25))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setBold(True)
        font.setWeight(75)
        self.toPreviousTheme.setFont(font)
        self.toPreviousTheme.setStyleSheet("QPushButton#toPreviousTheme\n"
"{\n"
"   background-color: #225765;\n"
"color: #fed346;\n"
"border-top-left-radius: 5px;\n"
"border-bottom-left-radius: 5px;\n"
"}\n"
"\n"
"QPushButton:hover#toPreviousTheme\n"
"{\n"
"    background-color: #3674a5;\n"
"}")
        self.toPreviousTheme.setObjectName("toPreviousTheme")
        self.toPreviousTheme.setText("Назад")



####################################################################################
###############################     CONTENT     ####################################
####################################################################################


    def page_1(self):
#This is topic for this label (1st paragraph)
        self.P1 = QtWidgets.QLabel(self.centralwidget)
        self.P1.setGeometry(QtCore.QRect(10, 110, 281, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.P1.setFont(font)
        self.P1.setStyleSheet("background-color: none;")
        self.P1.setObjectName("P1")
        self.P1.setText("Коротка історична довідка")



#This is Label with text-content forwarded to 1st paragraph.
        self.textToP1 = QtWidgets.QLabel(self.centralwidget)
        self.textToP1.setGeometry(QtCore.QRect(10, 135, 601, 201))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.textToP1.setFont(font)
        self.textToP1.setStyleSheet("background-color: none;\n"
"")
        self.textToP1.setTextFormat(QtCore.Qt.PlainText)
        self.textToP1.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.textToP1.setObjectName("textToP1")
        self.textToP1.setText("Мова програмування Python була створена до 1991 року голландцем Гвідо ван Россум.\n"
"Своє ім\'я - Пайтон (або Пітон) - отримала від назви телесеріалу, а не плазуна.\n"
"Після того, як Россум розробив мову, він виклав його в Інтернет, де спільнота програмістів\n"
"приєдналося до його поліпшення.\n"
"Python активно розвивається в даний час. Часто виходять нові версії.\n"
" Існують дві підтримувані гілки: Python 2.x і Python 3.x. Тут англійською \n"
"буквою \"x\" позначається конкретний реліз. Між другим і третім Пітоном є невелика різниця. \n"
"\n"
"В даному курсі за основу береться Python 3.x.\n"
"Офіційний сайт підтримки мови - https://www.python.org.")



#This is topic for second label (2nd paragraph)
        self.P2 = QtWidgets.QLabel(self.centralwidget)
        self.P2.setGeometry(QtCore.QRect(10, 300, 281, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.P2.setFont(font)
        self.P2.setStyleSheet("background-color: none;")
        self.P2.setObjectName("P2")
        self.P2.setText("Основні особливості мови")



#This is Label with text-content forwarded to 2nd paragraph.
        self.textToP2 = QtWidgets.QLabel(self.centralwidget)
        self.textToP2.setGeometry(QtCore.QRect(10, 320, 601, 311))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.textToP2.setFont(font)
        self.textToP2.setStyleSheet("background-color: none;\n"
"")
        self.textToP2.setTextFormat(QtCore.Qt.PlainText)
        self.textToP2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.textToP2.setObjectName("textToP2")
        self.textToP2.setText("Python - інтерпретована мова програмування. Це означає, що вихідний код частинами\n"
"перетворюється в машинний в процесі його читання спеціальною програмою - інтерпретатором.\n"
"\n"
"Python характеризується ясним синтаксисом. Читати код на ньому легше, ніж на інших мовах\n"
"програмування, т. К. В Пітоні мало використовуються такі допоміжні синтаксичні елементи як \n"
"дужки, крапки з комою. З іншого боку, правила мови змушують програмістів робити \n"
"відступи для позначення вкладених конструкцій. Зрозуміло, що добре оформлений текст \n"
"з малою кількістю відволікаючих елементів читати і розуміти легше.\n"
"\n"
"Python - це повноціннa багато в чому універсальна мова програмування, що використовується в \n"
"різних сферах. Основна, але не єдина, підтримувана їм парадигма, - \n"
"об\'єктно-орієнтоване програмування. Однак в даному курсі ми тільки згадаємо про об\'єкти, \n"
"а будемо вивчати структурне програмування, так як воно є базою. Без знання основних \n"
"типів даних, розгалужень, циклів, функцій немає сенсу вивчати більш складні \n"
"парадигми, т. я. В них все це використовується.\n"
"\n"
"Інтерпретатори Python поширюється вільно на підставі ліцензії подібної \n"
"GNU General Public License.")


    #########################################################################################
    ##########################          FOR BUTTONS          ################################
    #########################################################################################
    ####################       ФУНКЦИОНАЛ ДЛЯ СМЕНЫ КОНТЕНТА       ##########################
    #########################################################################################





        #self.toNextTheme.clicked.connect()
        self.toNextTheme.clicked.connect(self.page_1)
import source_rc


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

标签: pythonpyqt5

解决方案


不要修改 Qt Designer 生成的代码,而是创建另一个继承自相应小部件的类并使用初始类来填充它。

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_FirstTheme(object):
    def setupUi(self, FirstTheme):
        FirstTheme.setObjectName("FirstTheme")
        FirstTheme.resize(600, 700)
        FirstTheme.setMinimumSize(QtCore.QSize(600, 700))
        FirstTheme.setMaximumSize(QtCore.QSize(600, 700))
        icon = QtGui.QIcon.fromTheme("icon.ico")
        FirstTheme.setWindowIcon(icon)
        FirstTheme.setStyleSheet("background-color: #070506;\n"
"color: grey;\n"
"")
        self.centralwidget = QtWidgets.QWidget(FirstTheme)
        self.centralwidget.setObjectName("centralwidget")
        FirstTheme.setCentralWidget(self.centralwidget)
        QtCore.QMetaObject.connectSlotsByName(FirstTheme)
        FirstTheme.setWindowTitle("1.Знайомство з Python")
        #This is variable with number of page
        self.pagination = 1

        #This is image (space) where situated the topic of theme 
        self.header = QtWidgets.QLabel(self.centralwidget)
        self.header.setGeometry(QtCore.QRect(0, 0, 600, 103))
        self.header.setStyleSheet("image: url(lena.jpg)")                    # !!! 
        self.header.setText("")
        self.header.setObjectName("header")

        #This is topic of the theme.
        self.ThemeName = QtWidgets.QLabel(self.centralwidget)
        self.ThemeName.setGeometry(QtCore.QRect(39, 21, 522, 60))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.ThemeName.setFont(font)
        self.ThemeName.setStyleSheet("QLabel#ThemeName\n"
"{\n"
"color: #fed346;\n"
"background:none;\n"
"}")
        self.ThemeName.setObjectName("ThemeName")
        self.ThemeName.setText("1.Знайомство з мовою програмування\n"
"                           Python")

        #This is pushbutton. She may change the text and images on widget to Next theme
        self.toNextTheme = QtWidgets.QPushButton(self.centralwidget)
        self.toNextTheme.setGeometry(QtCore.QRect(310, 662, 100, 25))
        #This is font settings for text of this pushButton
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setBold(True)
        font.setWeight(75)
        self.toNextTheme.setFont(font)
        #This is css for NextPuchButton
        self.toNextTheme.setStyleSheet("QPushButton#toNextTheme\n"
"{\n"
"   background-color: #225765;\n"
"color: #fed346;\n"
"border-top-right-radius: 5px;\n"
"border-bottom-right-radius: 5px;\n"
"}\n"
"\n"
"QPushButton:hover#toNextTheme\n"
"{\n"
"    background-color: #3674a5;\n"
"}")
        self.toNextTheme.setObjectName("toNextTheme")
        self.toNextTheme.setText("Далі")

        #This is pushButton. She is change the text on widget to previous theme
        self.toPreviousTheme = QtWidgets.QPushButton(self.centralwidget)
        self.toPreviousTheme.setEnabled(True)
        self.toPreviousTheme.setGeometry(QtCore.QRect(190, 662, 100, 25))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setBold(True)
        font.setWeight(75)
        self.toPreviousTheme.setFont(font)
        self.toPreviousTheme.setStyleSheet("QPushButton#toPreviousTheme\n"
"{\n"
"   background-color: #225765;\n"
"color: #fed346;\n"
"border-top-left-radius: 5px;\n"
"border-bottom-left-radius: 5px;\n"
"}\n"
"\n"
"QPushButton:hover#toPreviousTheme\n"
"{\n"
"    background-color: #3674a5;\n"
"}")
        self.toPreviousTheme.setObjectName("toPreviousTheme")
        self.toPreviousTheme.setText("Назад")

        #self.toNextTheme.clicked.connect()
#        self.toNextTheme.clicked.connect(self.page_1)

# import source_rc   # !!!


class ExampleApp(QtWidgets.QMainWindow, Ui_FirstTheme):                       # +++
    def __init__(self, parent=None):                                          # +++
        super(ExampleApp, self).__init__(parent)                              # +++

        self.setupUi(self)                                                    # +++

        #self.toNextTheme.clicked.connect()
        self.toNextTheme.clicked.connect(self.page_1)                         # +++

    ###   CONTENT   ###
    def page_1(self):
        print('#This is topic for this label (1st paragraph)')
        self.P1 = QtWidgets.QLabel(self.centralwidget)
        self.P1.setGeometry(QtCore.QRect(10, 110, 281, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.P1.setFont(font)
        self.P1.setStyleSheet("background-color: none;")
        self.P1.setObjectName("P1")
        self.P1.setText("Коротка історична довідка")

        #This is Label with text-content forwarded to 1st paragraph.
        self.textToP1 = QtWidgets.QLabel(self.centralwidget)
        self.textToP1.setGeometry(QtCore.QRect(10, 135, 601, 201))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.textToP1.setFont(font)
        self.textToP1.setStyleSheet("background-color: none;\n"
"")
        self.textToP1.setTextFormat(QtCore.Qt.PlainText)
        self.textToP1.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.textToP1.setObjectName("textToP1")
        self.textToP1.setText("Мова програмування Python була створена до 1991 року голландцем Гвідо ван Россум.\n"
"Своє ім\'я - Пайтон (або Пітон) - отримала від назви телесеріалу, а не плазуна.\n"
"Після того, як Россум розробив мову, він виклав його в Інтернет, де спільнота програмістів\n"
"приєдналося до його поліпшення.\n"
"Python активно розвивається в даний час. Часто виходять нові версії.\n"
" Існують дві підтримувані гілки: Python 2.x і Python 3.x. Тут англійською \n"
"буквою \"x\" позначається конкретний реліз. Між другим і третім Пітоном є невелика різниця. \n"
"\n"
"В даному курсі за основу береться Python 3.x.\n"
"Офіційний сайт підтримки мови - https://www.python.org.")

        #This is topic for second label (2nd paragraph)
        self.P2 = QtWidgets.QLabel(self.centralwidget)
        self.P2.setGeometry(QtCore.QRect(10, 300, 281, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.P2.setFont(font)
        self.P2.setStyleSheet("background-color: none;")
        self.P2.setObjectName("P2")
        self.P2.setText("Основні особливості мови")

        #This is Label with text-content forwarded to 2nd paragraph.
        self.textToP2 = QtWidgets.QLabel(self.centralwidget)
        self.textToP2.setGeometry(QtCore.QRect(10, 320, 601, 311))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.textToP2.setFont(font)
        self.textToP2.setStyleSheet("background-color: none;\n"
"")
        self.textToP2.setTextFormat(QtCore.Qt.PlainText)
        self.textToP2.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.textToP2.setObjectName("textToP2")
        self.textToP2.setText("Python - інтерпретована мова програмування. Це означає, що вихідний код частинами\n"
"перетворюється в машинний в процесі його читання спеціальною програмою - інтерпретатором.\n"
"\n"
"Python характеризується ясним синтаксисом. Читати код на ньому легше, ніж на інших мовах\n"
"програмування, т. К. В Пітоні мало використовуються такі допоміжні синтаксичні елементи як \n"
"дужки, крапки з комою. З іншого боку, правила мови змушують програмістів робити \n"
"відступи для позначення вкладених конструкцій. Зрозуміло, що добре оформлений текст \n"
"з малою кількістю відволікаючих елементів читати і розуміти легше.\n"
"\n"
"Python - це повноціннa багато в чому універсальна мова програмування, що використовується в \n"
"різних сферах. Основна, але не єдина, підтримувана їм парадигма, - \n"
"об\'єктно-орієнтоване програмування. Однак в даному курсі ми тільки згадаємо про об\'єкти, \n"
"а будемо вивчати структурне програмування, так як воно є базою. Без знання основних \n"
"типів даних, розгалужень, циклів, функцій немає сенсу вивчати більш складні \n"
"парадигми, т. я. В них все це використовується.\n"
"\n"
"Інтерпретатори Python поширюється вільно на підставі ліцензії подібної \n"
"GNU General Public License.")

        self.P1.show()                   # +++
        self.textToP1.show()             # +++
        self.P2.show()                   # +++
        self.textToP2.show()             # +++


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
#    FirstTheme = QtWidgets.QMainWindow()
#    ui = Ui_FirstTheme()
#    ui.setupUi(FirstTheme)
#    FirstTheme.show()
    w = ExampleApp()
    w.show()
    sys.exit(app.exec_())

在此处输入图像描述


推荐阅读