首页 > 解决方案 > PyQt:如何用另一个窗口上的按钮刷新一个窗口上的标签?

问题描述

亲爱的stackoverflow用户您好

简介: 我是 Python 的新手,想用 PyQt5 为我的 Raspberry Pi 构建一个触摸 GUI。因此,我使用 QtDesigner 在 Windows 7 上构建 .ui 文件。之后,在 Pi 的 LXTerminal 中使用“pyuic5 -x file.ui -o file.py”将文件转换为 .py 文件。

我的 GUI: 我需要建立一个带有标签和按钮的输出窗口(MainWindow),它会打开另一个窗口(我选择对话框)进行输入。输入窗口有一个用于设置值的旋转框和一个用于更大值步长的水平滑块。窗口底部是一个按钮,它将旋转框的值设置为全局变量并再次关闭输入窗口。

问题: 我希望关闭此窗口的输入窗口的按钮也刷新 MainWindow 的输出标签,以便它显示新值。

图片: 我还不能嵌入我的 GUI 图片,所以请看下面的链接。

主窗口

输入窗口

InputWindow 与滑块和旋转框之间的连接

我的代码: 下面的代码是一个简单的例子,除了标签的刷新之外,一切正常。请帮助我完成这项工作,即使对于高级和专业的开发人员来说可能非常简单。我花了几天的时间尝试和搜索这个,并得到了很多更复杂的东西。

最良好的祝愿,

拉斯皮马努

#!/usr/bin/env python
# -*- coding: utf-8 -*-


from PyQt5 import QtCore, QtGui, QtWidgets

value = 0

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(890, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(180, 100, 500, 250))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(180, 370, 500, 100))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        ############
        self.pushButton.clicked.connect(self.OpenInput)
        ############

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Value"))
        self.pushButton.setText(_translate("MainWindow", "Go to input window"))


    ##############################
    # Show second window for input

    def OpenInput(self, MainWindow):
        Dialog.show()

    ##############################


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(889, 598)

        self.spinBox = QtWidgets.QSpinBox(Dialog)
        self.spinBox.setGeometry(QtCore.QRect(210, 170, 471, 141))
        font = QtGui.QFont()
        font.setPointSize(33)
        self.spinBox.setFont(font)
        self.spinBox.setAlignment(QtCore.Qt.AlignCenter)
        self.spinBox.setObjectName("spinBox")

        self.horizontalSlider = QtWidgets.QSlider(Dialog)
        self.horizontalSlider.setGeometry(QtCore.QRect(209, 360, 471, 61))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")

        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(310, 460, 271, 71))
        font = QtGui.QFont()
        font.setPointSize(13)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        ############
        self.pushButton.clicked.connect(self.CloseAndRefresh)
        ############

        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(210, 40, 471, 91))
        font = QtGui.QFont()
        font.setPointSize(24)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.retranslateUi(Dialog)
        self.horizontalSlider.valueChanged['int'].connect(self.spinBox.setValue)
        self.spinBox.valueChanged['int'].connect(self.horizontalSlider.setValue)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "Back to first Window"))
        self.label.setText(_translate("Dialog", "Value"))


    #######################################################
    # Close second window and refresh label on first window

    def CloseAndRefresh(self):
        global value
        value = self.spinBox.value()
        print(value) #checking input

        ##################################################
        # The refresh of the outputting label on the     #
        # MainWindow should be started at this position. #
        ##################################################

        Dialog.close()

    #######################################################


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    Dialog = QtWidgets.QDialog()
    dia = Ui_Dialog()
    dia.setupUi(Dialog)

    sys.exit(app.exec_())

标签: pythonpython-3.xpyqtraspberry-pipyqt5

解决方案


尝试一下:

from PyQt5 import QtCore, QtGui, QtWidgets

value = 0

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(890, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(180, 100, 500, 250))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label.setFont(font)
        self.label.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(180, 370, 500, 100))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        ############
        self.pushButton.clicked.connect(self.OpenInput)
        ############

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Value"))
        self.pushButton.setText(_translate("MainWindow", "Go to input window"))


    ##############################
    # Show second window for input

    def OpenInput(self, MainWindow):
        Dialog.show()

    ##############################

    # +++    
    def labelText(self, MainWindow, value):
        self.label.setText(str(value)) 


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(889, 598)

        self.spinBox = QtWidgets.QSpinBox(Dialog)
        self.spinBox.setGeometry(QtCore.QRect(210, 170, 471, 141))
        font = QtGui.QFont()
        font.setPointSize(33)
        self.spinBox.setFont(font)
        self.spinBox.setAlignment(QtCore.Qt.AlignCenter)
        self.spinBox.setObjectName("spinBox")

        self.horizontalSlider = QtWidgets.QSlider(Dialog)
        self.horizontalSlider.setGeometry(QtCore.QRect(209, 360, 471, 61))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")

        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(310, 460, 271, 71))
        font = QtGui.QFont()
        font.setPointSize(13)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        ############
        self.pushButton.clicked.connect(self.CloseAndRefresh)
        ############

        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(210, 40, 471, 91))
        font = QtGui.QFont()
        font.setPointSize(24)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.retranslateUi(Dialog)
        self.horizontalSlider.valueChanged['int'].connect(self.spinBox.setValue)
        self.spinBox.valueChanged['int'].connect(self.horizontalSlider.setValue)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "Back to first Window"))
        self.label.setText(_translate("Dialog", "Value"))


    #######################################################
    # Close second window and refresh label on first window

    def CloseAndRefresh(self):
        global value
        value = self.spinBox.value()
        print(value) #checking input

        # +++
        ui.labelText(MainWindow, value)

        ##################################################
        # The refresh of the outputting label on the     #
        # MainWindow should be started at this position. #
        ##################################################

        Dialog.close()

    #######################################################


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    Dialog = QtWidgets.QDialog()
    dia = Ui_Dialog()
    dia.setupUi(Dialog)

    sys.exit(app.exec_())

在此处输入图像描述


推荐阅读