A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

由于文章长度限制就分2部分给大家介绍
PyQt——结合Python与Qt的GUI编程(qq_25600055)                       

在Python3下运行程序:

$ python3 hello_pyqt.py


PyQt程序运行效果


从上面的例子可以看出手动编写代码调用PyQt依然十分不便,好在PyQt还为我们准备了Qt GUI界面的转换工具,可以将Qt Creator生成的.ui文件直接转换成Python代码。比如需要对test.ui进行转换,其命令如下:

$ pyuic4 test.ui -x -o test.py


其中-x参数相当于--execute,在代码中增加了一些测试语句,这样生成的Python文件就可以直接执行了。之后我们就可以在生成的代码基础上实现自己的功能。


在Python借用Qt强大的图形控件


1.2.例:通过PyQt设计CPU温度监控软件

这里我们将通过PyQt设计一个监控树莓派内核温度的小软件。首先打开QtCreator,新建一个Qt GUI应用程序工程(如何在树莓派2本地安装运行Qt Creator,请参见:编程篇(一)在树莓派2上本地开发Qt GUI程序)。设计如下图所示的窗口界面:


在Qt Creator中设计GUI


通过pyuic命令将GUI文件转换成Python文件,然后在此基础上进行修改,代码如下:

from PyQt4 import QtCore, QtGui

import os


try:

    _fromUtf8 = QtCore.QString.fromUtf8

except AttributeError:

    _fromUtf8 = lambda s: s


class Ui_HelloPyQt(object):

    def setupUi(self, HelloPyQt):

        HelloPyQt.setObjectName(_fromUtf8("HelloPyQt"))

        HelloPyQt.resize(304, 212)

        self.centralWidget = QtGui.QWidget(HelloPyQt)

        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))

        self.lcdTemp = QtGui.QLCDNumber(self.centralWidget)

        self.lcdTemp.setGeometry(QtCore.QRect(40, 40, 221, 81))

        self.lcdTemp.setSmallDecimalPoint(False)

        self.lcdTemp.setDigitCount(6)

        self.lcdTemp.setObjectName(_fromUtf8("lcdTemp"))

        self.sliderAlarm = QtGui.QSlider(self.centralWidget)

        self.sliderAlarm.setGeometry(QtCore.QRect(40, 170, 221, 16))

        self.sliderAlarm.setMaximum(120)

        self.sliderAlarm.setProperty("value", 80)

        self.sliderAlarm.setOrientation(QtCore.Qt.Horizontal)

        self.sliderAlarm.setTickPosition(QtGui.QSlider.NoTicks)

        self.sliderAlarm.setObjectName(_fromUtf8("sliderAlarm"))

        self.labelAlarm = QtGui.QLabel(self.centralWidget)

        self.labelAlarm.setGeometry(QtCore.QRect(40, 150, 221, 16))

        self.labelAlarm.setObjectName(_fromUtf8("labelAlarm"))

        self.labelTemp = QtGui.QLabel(self.centralWidget)

        self.labelTemp.setGeometry(QtCore.QRect(40, 20, 221, 16))

        self.labelTemp.setObjectName(_fromUtf8("labelTemp"))

      

        #Add timer

        self.timerTemp = QtCore.QTimer(self.centralWidget)      

        HelloPyQt.setCentralWidget(self.centralWidget)      

      

        # Add slots

        self.sliderAlarm.valueChanged.connect(self.sliderAlarm_ValueChanged)

        self.timerTemp.timeout.connect(self.timerTemp_TimeOut)

        # Use the timeout event to initialize the LCD

        self.timerTemp_TimeOut()

        # Start timer, time out per 2 seconds

        self.timerTemp.start(2000)

      

      

        self.retranslateUi(HelloPyQt)

        QtCore.QMetaObject.connectSlotsByName(HelloPyQt)

                                       


    def retranslateUi(self, HelloPyQt):

        HelloPyQt.setWindowTitle(QtGui.QApplication.translate("HelloPyQt", "HelloPyQt", None, QtGui.QApplication.UnicodeUTF8))

        self.labelAlarm.setText(QtGui.QApplication.translate("HelloPyQt", "Alarm: 80C", None, QtGui.QApplication.UnicodeUTF8))

        self.labelTemp.setText(QtGui.QApplication.translate("HelloPyQt", "CPU Temperature", None, QtGui.QApplication.UnicodeUTF8))


    # Event triggered when the value of labelAlarm changed

    def sliderAlarm_ValueChanged(self):

        self.labelAlarm.setText("Alarm: " + str(self.sliderAlarm.value()) + "C")

      

    # Event triggered when timerTemp time out

    def timerTemp_TimeOut(self):

        # Get temperature from sensor file

        sensor = os.popen("cat /sys/class/thermal/thermal_zone0/temp")

        temp = float(sensor.readline()) / 1000

        alarm = float(self.sliderAlarm.value())

        # Display temperature

        self.lcdTemp.display("%.1fC" % temp)

        # Check whether the temperature is too high

        if temp <= alarm * 0.6:

            self.lcdTemp.setStyleSheet("color: green")

        elif temp <= alarm * 0.8:

            self.lcdTemp.setStyleSheet("color: orange")

        elif temp <= alarm:

            self.lcdTemp.setStyleSheet("color: red")

        else:

            self.lcdTemp.setStyleSheet("color: red")

            msg = QtGui.QMessageBox()

            msg.setWindowTitle("Alarm")

            msg.setText("Temperature is too high!")

            msg.setIcon(QtGui.QMessageBox.Warning)

            msg.exec_()

            # You can do something else here, like shut down the system

           

if __name__ == "__main__":

    import sys

    app = QtGui.QApplication(sys.argv)

    HelloPyQt = QtGui.QMainWindow()

    ui = Ui_HelloPyQt()

    ui.setupUi(HelloPyQt)

    HelloPyQt.show()

sys.exit(app.exec_())



代码中新建了一个QTimer定时器控件,用于定时查询CPU当前的温度并更新显示。self.timerTemp.timeout.connect()语句将定时器的超时信号链接至timerTemp_TimeOut()函数。self.timerTemp.start(2000)设置定时器超时时间为200ms,即每2秒执行一次timerTemp_TimeOut()函数。

LCD控件用于显示CPU当前的温度。在显示界面和运行定时器之前,可以通过手动调用self.timerTemp_TimeOut()函数读取CPU温度来初始化LCD控件内容。

CPU的温度通过读取 /sys/class/thermal/thermal_zone0/temp文件内容获得。这里采用os.popen()方法在Linux Shell中通过cat命令读取文件,并将返回的字符串信息转换为数字显示在LCD控件中。

窗口下面的滚动条用于设置温度报警门限,如果CPU温度接近门限值,则会改变温度显示的颜色。如果超过门限值则弹出对话框报警。


温度监控程序运行效果


这里我们还可以使用一个小程序将CPU占用率提高到100%来提升CPU温度,只要编写一段死循环的运算代码即可(一个Python进程只能在单个内核上运行,对于树莓派2,需要同时启动4个进程才能跑满全部内核)。代码内容如下:

while True:

    a = 1298/1412


多进程后台执行:

$ python tst.py&

$ python tst.py&

$ python tst.py&

$ python tst.py&


提高CPU占用率

                                                                                                                                        查看原文>>

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马