输入等待后更新qlabel

时间:2017-11-08 03:16:04

标签: python pyqt5

我已经看到了一些关于此的信息,但是一切似乎都是PyQt4而不是PyQt5,我不确定是否存在差异。我无法得到任何工作。

我想要做的是让用户在输入文本并保存后更新QLabel。现在我有了一个主窗口,可以从下拉菜单中选择一个按钮或一个选项,弹出一个可以更改设定点的窗口。

现在发生的事情是用户可以输入新数据,但代码似乎仍在运行,而不是等待用户在弹出窗口中进行更改。在任何更改之前调用我的updateSetpoints函数。

# popups the reactorSetpoints window to change the setpoints for
# the reactor.  This is where I am haiving troubles, the code
# continues before the user can input new setpoints
def reactorSetpoints(self):       
    exPopup = setpointsPopup(self)
    self.updateSetpoints()      

# just have it update the one value for now 
def updateSetpoints(self):
    self.pHUpperValue.setText(str(upper_pH))

按钮调用reactorSetpoints(self)并弹出一个新窗口

import sys
import matplotlib.pyplot as plt
import random

from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication,QLineEdit, QPushButton, QWidget, QDialog, QTextEdit, QLabel, QMenu, QVBoxLayout, QSizePolicy
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QTime, QTimer, QRect
from PyQt5 import QtCore


from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

debug = True
setPointsChanged = False

versionNumber = 'V0.0.1'
currentState = 'Treatment'
currentCycTime = '2:15:42'
remaningCycTime = '5:44:18'

current_pH = 6.85
current_DO = 1.90
currentTemp = 24.9
lower_pH = 6.95
upper_pH = 7.20
lower_DO = 2.00


def openFile():
    if debug == True:
        print("Open File")  

def saveFile():
    if debug == True:
        print("Save File")

def saveFileAs():
    if debug == True:
        print("Save File As...")

def editSysParm():
    if debug == True:
        print("Edit system parameters")



def reactorParameters():
    if debug == True:
        print("Edit reactor parameters")

def pHCalibration():
    if debug == True:
        print("pH Calibration")

def dOCalibration():
    if debug == True:
        print("DO calibration")

def pumpCalibration():
    if debug == True:
        print("Pump calibrations")

def editpHSetpoints():
    pass



# sets up the setpoints popup window with either the option to save 
# new setpoints, or to quit
class setpointsPopup(QDialog):
    def __init__(self, parent = None):      
        super().__init__(parent)        
        self.initUI()


    def initUI(self):
        self.setGeometry(100,100,300,300)
        self.upH = QLabel('Upper pH: ',self)
        self.lpH = QLabel('Lower pH: ',self)
        self.lDO = QLabel('Lower DO: ',self)    

        self.upHE = QLineEdit(self) 
        self.lpHE = QLineEdit(self)
        self.lDOE = QLineEdit(self)

        self.upHE.setPlaceholderText(str(upper_pH))
        self.lpHE.setPlaceholderText(str(lower_pH))
        self.lDOE.setPlaceholderText(str(lower_DO))

        self.exitSetpoints = QPushButton('Exit', self)
        self.saveSetpoints = QPushButton('Save New Setpoints', self)

        self.upH.move(5,5)
        self.upHE.move(90,5)

        self.lpH.move(5,40)
        self.lpHE.move(90,40)

        self.lDO.move(5,75)
        self.lDOE.move(90,75)

        self.exitSetpoints.setGeometry(QRect(5,120,50,30))
        self.exitSetpoints.clicked.connect(self.destroy)
        self.saveSetpoints.setGeometry(QRect(60,120,150,30))
        self.saveSetpoints.clicked.connect(self.verifySetpoints)
        self.show()


    #verification will be put here to make sure the input is valid
    #but for now it will accept anything for ease of testing
    def verifySetpoints(self):
        global upper_pH     
        newUpH = self.upHE.text()                   
        upper_pH = float(newUpH)            
        print(newUpH)       


# Main window
class drawMenuBar(QMainWindow):
    def __init__(self):     
        super().__init__()
        self.topL = 20
        self.top = 40
        self.width = 1000
        self.height = 500
        self.title = ('Batch Reactor Controller ' + versionNumber)
        self.initUI()


    def initUI(self):

        self.setWindowTitle(self.title)
        self.setGeometry(self.topL, self.top, self.width, self.height)

        exitAct = QAction('&Exit' , self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit Application')
        exitAct.triggered.connect(qApp.quit)    

        openAct = QAction('&Open', self)    
        openAct.setShortcut('Ctrl+O')
        openAct.setStatusTip('Open File')
        openAct.triggered.connect(openFile)

        saveAsAct = QAction('&Save As..', self)
        saveAsAct.setShortcut('Shift+Ctrl+S')
        saveAsAct.setStatusTip('Save as new file')
        saveAsAct.triggered.connect(saveFileAs)

        saveAct = QAction('Save', self)
        saveAct.setStatusTip('Save')
        saveAct.setShortcut('Ctrl+S')
        saveAct.triggered.connect(saveFile)

        systemSetpointsAct = QAction('Preferences', self)
        systemSetpointsAct.setStatusTip('Edit system parameters')
        systemSetpointsAct.triggered.connect(editSysParm)

        reactorSetpointsAct = QAction('Reactor Setpoints', self)
        reactorSetpointsAct.setStatusTip('Edit reactor setpoints')
        reactorSetpointsAct.triggered.connect(self.reactorSetpoints)

        reactorParametersAct = QAction('Reactor Parameters', self)
        reactorParametersAct.setStatusTip('Edit batch reactor profiles')
        reactorParametersAct.triggered.connect(reactorParameters)       

        pHCalibrationAct = QAction('pH Calibration', self)
        pHCalibrationAct.setStatusTip('pH Calibration')
        pHCalibrationAct.triggered.connect(pHCalibration)

        dOCalibrationAct = QAction('DO Calibration', self)
        dOCalibrationAct.setStatusTip('Dissolved oxygen calibration')
        dOCalibrationAct.triggered.connect(dOCalibration)

        pumpCalibrationAct = QAction('Pump Calibrations', self)
        pumpCalibrationAct.setStatusTip('Pump Calibrations')
        pumpCalibrationAct.triggered.connect(pumpCalibration)

        menubar = self.menuBar()
        self.statusBar()

        fileMenu = menubar.addMenu('&File')
        editMenu = menubar.addMenu('&Edit')
        calibrationMenu = menubar.addMenu('&Calibration')       

        fileMenu.addAction(openAct)
        fileMenu.addAction(saveAct)
        fileMenu.addAction(saveAsAct)       
        fileMenu.addAction(exitAct)

        calibrationMenu.addAction(pHCalibrationAct)
        calibrationMenu.addAction(dOCalibrationAct)
        calibrationMenu.addAction(pumpCalibrationAct)

        editMenu.addAction(systemSetpointsAct)
        editMenu.addAction(reactorSetpointsAct)         

        self.reactorTitle = QLabel('<b><u>Reactor 1 Status</u></b>', self)
        font = self.reactorTitle.font()
        font.setPointSize(20)
        self.reactorTitle.setFont(font)         
        self.reactorTitle.setGeometry(QtCore.QRect(10,30, 250, 45)) #(x, y, width, height)

        #pH Label
        self.pHLabel = QLabel('<span style="color:blue"><b>pH:</b></span>',self)
        font = self.pHLabel.font()      
        font.setPointSize(22)
        self.pHLabel.setFont(font)
        self.pHLabel.setGeometry(QtCore.QRect(10,50,100,100))

        #displays current pH value
        self.currentpH = QLabel('<b>' + str(current_pH) + '</b>', self)
        font = self.currentpH.font()
        font.setPointSize(22)
        self.currentpH.setFont(font)
        self.currentpH.setGeometry(QtCore.QRect(60,50,100,100))     

        #display lowerpH Setpoint 
        self.pHLowerLabel = QLabel('Lower pH setpoint: ', self)
        font = self.pHLowerLabel.font()
        font.setPointSize(10)
        self.pHLowerLabel.setFont(font)
        self.pHLowerLabel.setGeometry(QtCore.QRect(10, 105, 115, 50))

        self.pHLowerValue = QLabel('{0:0.2f}'.format(lower_pH), self)
        font = self.pHLowerValue.font()
        font.setPointSize(10)
        self.pHLowerValue.setFont(font)
        self.pHLowerValue.setGeometry(QtCore.QRect(120, 105, 50, 50))

        #display upper pH setpoint
        self.pHUpperLabel = QLabel('Upper pH setpoint: ', self)
        font = self.pHUpperLabel.font()
        font.setPointSize(10)
        self.pHUpperLabel.setFont(font)
        self.pHUpperLabel.setGeometry(QtCore.QRect(10, 120, 115, 50))

        self.pHUpperValue = QLabel('{0:0.2f}'.format(upper_pH), self)
        font = self.pHUpperValue.font()
        font.setPointSize(10)
        self.pHUpperValue.setFont(font)
        self.pHUpperValue.setGeometry(QtCore.QRect(120, 120, 50, 50))

        #pH button options
        self.pHToGraph = QPushButton('Graph pH', self)
        self.pHToGraph.move(10,160)
        self.pHToGraph.setToolTip('Show pH in live graph')
        self.pHToGraph.clicked.connect(self.displaypHGraph) 

        self.pHSetpointsButton = QPushButton('Update Setpoints', self)
        self.pHSetpointsButton.setGeometry(QtCore.QRect(115, 160, 150, 30))
        self.pHSetpointsButton.setToolTip('Edit pH Setpoints')
        self.pHSetpointsButton.clicked.connect(self.reactorSetpoints)   

        self.DOLabel = QLabel('<span style="color:blue"><b>DO:</b></span>',self)
        font = self.DOLabel.font()      
        font.setPointSize(22)
        self.DOLabel.setFont(font)
        self.DOLabel.setGeometry(QtCore.QRect(10,175,100,100))

        self.currentDO = QLabel('<b>' + str(current_DO) + ' mg/L</b>', self)
        font = self.currentDO.font()
        font.setPointSize(22)
        self.currentDO.setFont(font)
        self.currentDO.setGeometry(QtCore.QRect(60,175,150,100))    

        self.DOLowerLabel = QLabel('Lower DO setpoint: ', self)
        font = self.DOLowerLabel.font()
        font.setPointSize(10)
        self.DOLowerLabel.setFont(font)
        self.DOLowerLabel.setGeometry(QtCore.QRect(10, 225, 115, 50))

        self.DOLowerValue = QLabel('{0:0.2f}'.format(lower_DO) + ' mg/L', self)
        font = self.DOLowerValue.font()
        font.setPointSize(10)
        self.DOLowerValue.setFont(font)
        self.DOLowerValue.setGeometry(QtCore.QRect(120, 225, 75, 50))

        self.DOToGraph = QPushButton('Graph DO', self)
        self.DOToGraph.move(10,260)
        self.DOToGraph.setToolTip('Show DO in live graph')
        self.DOToGraph.clicked.connect(self.displaypHGraph)

        self.tempLabel = QLabel('<span style="color:blue"><b>Temperature:</b></span>',self)
        font = self.tempLabel.font()        
        font.setPointSize(22)
        self.tempLabel.setFont(font)
        self.tempLabel.setGeometry(QtCore.QRect(10,265,190,100))

        self.currentTemp = QLabel('<b>' + str(currentTemp) + '\u2103', self)
        font = self.currentTemp.font()
        font.setPointSize(22)
        self.currentTemp.setFont(font)
        self.currentTemp.setGeometry(QtCore.QRect(195,265,150,100)) 

        self.currentStatus = QLabel('<b><u>Other Parameters</u><b>', self)
        font = self.currentStatus.font()
        font.setPointSize(10)
        self.currentStatus.setFont(font)
        self.currentStatus.setGeometry(QtCore.QRect(10, 325, 200, 50))          

        self.currentStatus = QLabel('Current Cycle: ' + '<b>' + currentState + '</b>', self)
        font = self.currentStatus.font()
        font.setPointSize(10)
        self.currentStatus.setFont(font)
        self.currentStatus.setGeometry(QtCore.QRect(10, 340, 200, 50))  

        self.currentCycleTime = QLabel('Current Cycle Time (HH:MM:SS): ' + '<b>' + currentCycTime + '</b>', self)
        font = self.currentCycleTime.font()
        font.setPointSize(10)
        self.currentCycleTime.setFont(font)
        self.currentCycleTime.setGeometry(QtCore.QRect(10, 355, 250, 50))   

        self.remaningCycleTime = QLabel('Remaning Cycle Time (HH:MM:SS): ' + '<b>' + remaningCycTime + '</b>', self)
        font = self.remaningCycleTime.font()
        font.setPointSize(10)
        self.remaningCycleTime.setFont(font)
        self.remaningCycleTime.setGeometry(QtCore.QRect(10, 370, 275, 50))      
        self.show()     


    # just a dummy graph that I got off a tutorial, it works for what
    # i need it to do for now
    def displaypHGraph(self):
        print("Display pH")
        self.m = LinePlot(self, width = 16, height = 9)
        self.m.setGeometry(QtCore.QRect(300,40,660,370))
        self.m.show()

    def displayDOGraph(self):
        pass

    # was playing with how to update labels here.  Just a counter
    # that counts up the value from the initial
    # this will eventually be replaced with sensor inputs
    def updatepH(self):
        global current_pH 
        global lower_pH
        global upper_pH
        current_pH = current_pH + 0.01  
        display_pH = '{0:0.2f}'.format(current_pH)
        if current_pH < lower_pH:
            self.currentpH.setText('<span style="color:red"><b>' + str(display_pH) + '</b></span>')         
        elif current_pH > upper_pH:
            self.currentpH.setText('<span style="color:red"><b>' + str(display_pH) + '</b></span>')
        else:
            self.currentpH.setText('<span style="color:black"><b>' + str(display_pH) + '<b></span>')

    # same thing as with the updatepH function except for DO
    def updateDO(self):
        global current_DO
        global lower_DO
        current_DO = current_DO + 0.01
        display_DO = '{0:0.2f}'.format(current_DO)
        if current_DO < lower_DO:
            self.currentDO.setText('<span style = "color:red"><b>' + str(display_DO) + ' mg/L</b></span>')
        else:
            self.currentDO.setText('<span style = "color:black"><b>' + str(display_DO)+ ' mg/L</b></span>')

    # popups the reactorSetpoints window to change the setpoints for
    # the reactor.  This is where I am haiving troubles, the code
    # continues before the user can input new setpoints
    def reactorSetpoints(self):       
        exPopup = setpointsPopup(self)
        self.updateSetpoints()      

    # just have it update the one value for now 
    def updateSetpoints(self):
        self.pHUpperValue.setText(str(upper_pH))




# dummy plot, was learning how to put a matplotlib 
# it works for now                      
class LinePlot(FigureCanvas): 
    def __init__(self, parent=None, width=16, height=9, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding,QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
        self.plot()

    def plot(self):
        data = [6.89,6.90,6.91,6.92,6.93,6.92,6.96,6.99,7.12,7.14,6.98,6.93,7.01,6.90,7.11,7.21,7.13,6.99]
        ax = self.figure.add_subplot(111)
        ax.plot(data, 'r-')
        ax.set_title('pH')
        ax.set_xlabel('Time')
        ax.set_ylabel('pH Value')
        self.draw()   

def main():

    app = QApplication(sys.argv)
    ex = drawMenuBar()  
    timer = QTimer()
    timer.timeout.connect(ex.updatepH)
    timer.timeout.connect(ex.updateDO)  
    timer.start(1000)
    ex.show()   

    sys.exit(app.exec_())       


if __name__ == '__main__':
    main()

所以这一切都有效,除了我可以让标签更新的唯一方法是关闭设定点弹出窗口并重新打开它。退出弹出窗口时更新它的好方法是什么?

感谢。

0 个答案:

没有答案