【问题标题】:PyQt: How to refresh label on one window with push button on another one?PyQt:如何用另一个窗口上的按钮刷新一个窗口上的标签?
【发布时间】:2018-05-03 13:45:30
【问题描述】:

亲爱的stackoverflow用户你好

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

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

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

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

MainWindow

InputWindow

InputWindow with Connections between slider and spin box

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

祝你好运,

RaspiManu

#!/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_())

【问题讨论】:

    标签: python python-3.x pyqt raspberry-pi pyqt5


    【解决方案1】:

    试试看:

    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_())
    

    【讨论】:

    • 仅显示代码而不解释任何内容或在代码中制作 cmets 的答案质量不佳。我建议你阅读How to Answer
    • 非常感谢! :) 我知道这将是 2-4 行代码,但我无法让它工作。这让我很开心:D
    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2014-10-15
    相关资源
    最近更新 更多