zoukankan      html  css  js  c++  java
  • 利用PyQt4写的小工具软件

    应公司文职工作人员需求,写一个车间人员工作时间的统计软件,输入开始工作时间1,再输入结束工作时间2,计算两个时间的差值。
    根据需求,初步构想的UI界面如下:

    下面开始干活。
    分析后觉得利用PyQt4来设置UI

    • PyQt4的安装不表,注意PyQt4的安装目录在Libsite-packagesPyQt4
    • PyQt4的资料请查看Libsite-packagesPyQt4dochtml
    • PyQt4的界面设计。界面设计先利用PyQt4安装目录下的designer.exe,拖拽控件即可。这里的前提是熟悉PyQt4的界面控件。对于如何快速熟悉PyQt4的界面控件,根据知友的推荐,请查看http://www.qaulau.com/books/PyQt4_Tutorial/,教程不长,一天能差不多,将里面的例子敲一遍,我用了一上午+大半下午,对于前面几章的例子完全敲了一遍,敲了一上午,后面的例子繁琐就直接拷贝例程中的代码运行了一遍,大概知道了每个控件的作用。对于控件的效果,同时可以打开designer.exe拖拽控件后,了解控件的大概作用。
    • 利用designer.exe拖拽好控件,注意控件的名称命名,界面中许多控件重复N次,必须按照一定的规则命名。这里采用的命名规则是:对于“开始1”、“结束1”和“累计时间1”灯提示label的命名为label_1S、label_1E、label_1T;对于“月”、“日”、“时”和“分”标签采用行+列的方式,如label_1Month2表示结束1那列中的“月”
    • 拖拽好界面后,会生成后缀名为*.UI的文件,必须将这个文件转换成.py文件。下面讲讲如何将UI文件生成py文件。利用Libsite-packagesPyQt4uicpyuic.py生成py文件。具体用法是"E:Pythonprogrampython" "E:PythonprogramLibsite-packagesPyQt4uicpyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9其中%1~%9表示命令行参数1-9,其中这行命令已经被PyQt封装成了E:PythonprogramLibsite-packagesPyQt4pyuic4.bat。具体的用法为:pyuic4 xx.ui -o xx.py。现在有个缺点就是pyuic4必须加入环境变量中,或者进入E:PythonprogramLibsite-packagesPyQt4中,这就不能在我们的当前代码目录下使用。解决方法:可以自己写一个bat文件获取当前目录,并且调用PyQt4。如
    @echo off
    ::获取当前盘符
    @echo off
    ::获取当前盘符
    echo %~d0
    ::获取当前盘符和路径
    echo %~dp0
    ::当前盘符和路径文件名格式
    echo %~sdp0
    ::当前批处理的全路径
    echo %~f0
    ::当期CMD默认目录
    echo %cd%
    
    for /r %~dp0 %%i in (*.ui) do (
    echo %%~ni
    pyuic4 %%~nxi -o %%~ni.py)
    pause
    

    将这个保存为UI.bat后,将这个UI.bat拷贝至代码目录下,运行后就会生成和*.ui同名的py文件。

    • 生成的py文件只是一个界面的类,如何来实例化这个类,并且最终生成界面,此时再创建一个py文件,来实例化UI中的类。Efficient.py代码如下(参照http://www.qaulau.com/books/PyQt4_Tutorial/)中的例程进行编写:
    # -*- coding = utf-8 -*-
    
    # Absolute.py
    
    import sys
    import UI
    from PyQt4 import QtCore,QtGui
    
    class Efficiency(QtGui.QMainWindow):
        def __init__(self, parent = None):
            super(Efficiency, self).__init__(parent)
    
            self.MainWindown = UI.Ui_MainWindow(self)
            #self.MainWindown.setupUi(self)
    
    
    app = QtGui.QApplication(sys.argv)
    
    ab =  Efficiency()
    ab.show()
    
    sys.exit(app.exec_())
    
    • 对生成的UI类进行修改,默认UI类是继承于Object,将其改成QMainWindow,
    • 对输入进行限制,例如月份只能输入1-12,日期只能输入1-31等,利用QIntValidator方法来实现,具体的用法请参考PyQt4安装目录下的doc文档
            #月份的输入限制
            MonthValidator = QtGui.QIntValidator(1,12)
            self.lineEdit_1Month1.setValidator(MonthValidator)
            self.lineEdit_1Month2.setValidator(MonthValidator)
            self.lineEdit_2Month1.setValidator(MonthValidator)
            self.lineEdit_2Month2.setValidator(MonthValidator)
            self.lineEdit_3Month1.setValidator(MonthValidator)
            self.lineEdit_3Month2.setValidator(MonthValidator)
    
    • 对输入框中的值设置默认值,这个写一个setDFSec1方法,在构造函数__init__调用即可。例如下面这个例子将输入框中内容设置成当前日期和时间,这里涉及到字符串转整形和整形装字符串。
      • 整型转字符串,利用QString的number方法
            curDateTime = QtCore.QDateTime.currentDateTime()
            self.lineEdit_1Month1.setText(QtCore.QString.number(curDateTime.date().month()))
            self.lineEdit_1Date1.setText(QtCore.QString.number(curDateTime.date().day()))
            self.lineEdit_1Hour1.setText(QtCore.QString.number(curDateTime.time().hour()))
            self.lineEdit_1Minute1.setText(QtCore.QString.number(curDateTime.time().minute()))
    
    • 为了节省输入,只要修改“开始”列的月份、日期和小时字段,“结束”列的月份、日期和小时字段就保持同步修改。这个功能的实现需要用到lineEdit的textChanged(QString)信号,并且定义一个同步方法。 self.connect(self.lineEdit_2Month1, QtCore.SIGNAL('textChanged(QString)'), self.syncMonth2)这里我们连接lineEdit的 textChanged 信号到我们自定义的syncMonth2槽,
        def syncMonth2(self):
             self.lineEdit_2Month2.setText(self.lineEdit_2Month1.text())
    
    • 结束时间和开始时间的减法。这个减法涉及到月份、日期,不是普通的四则运算可以解决了。查看网上资料得知可以通过QtCore.QDateTime的secsTo方法来实现,这个方法返回连个时间之间的时间差,以秒为单位,知道了秒,就可以通过/3600得到小时,/60得到分钟。现在问题就是将开始时间的月日小时分初始化一个QDateTime类,年份设置成当前年份
      • 字符串变整型,通过int()强制转换
        def calTime2(self):
            curDT = QtCore.QDateTime.currentDateTime()
            dt0 = QtCore.QDateTime(curDT.date().year(), int(self.lineEdit_2Month1.text()), int(self.lineEdit_2Date1.text()), int(self.lineEdit_2Hour1.text()), int(self.lineEdit_2Minute1.text()))
            dt1 = QtCore.QDateTime(curDT.date().year(), int(self.lineEdit_2Month2.text()), int(self.lineEdit_2Date2.text()), int(self.lineEdit_2Hour2.text()), int(self.lineEdit_2Minute2.text()))
            timeElapsed = dt0.secsTo(dt1)
            hourElapsed = timeElapsed / 3600
            minuteElapsed = (timeElapsed % 3600) / 60
            self.lineEdit_2Hour3.setText(QtCore.QString.number(hourElapsed))
            self.lineEdit_2Minute3.setText(QtCore.QString.number(minuteElapsed))
    
    • 增加一个按键,可以将输入框中的内容清零,涉及点,重写按钮的clicked事件self.connect(self.pushButton, QtCore.SIGNAL('clicked()'),self.buttonClicked)
  • 相关阅读:
    docker run 参数含义
    java——数组队列 ArrayQueue
    java——数组栈 ArrayStack
    java——时间复杂度、动态数组
    java——异常类、异常捕获、finally、异常抛出、自定义异常
    java——变量
    java——虚拟机、线程
    java——内部类
    java——object类
    java——抽象类、接口、二者区别
  • 原文地址:https://www.cnblogs.com/smileintheday/p/6265868.html
Copyright © 2011-2022 走看看