应公司文职工作人员需求,写一个车间人员工作时间的统计软件,输入开始工作时间1,再输入结束工作时间2,计算两个时间的差值。

根据需求,初步构想的UI界面如下:

下面开始干活。

分析后觉得利用PyQt4来设置UI

  • PyQt4的安装不表,注意PyQt4的安装目录在\Lib\site-packages\PyQt4
  • PyQt4的资料请查看\Lib\site-packages\PyQt4\doc\html
  • 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文件。利用\Lib\site-packages\PyQt4\uic\pyuic.py生成py文件。具体用法是"E:\Python\program\python" "E:\Python\program\Lib\site-packages\PyQt4\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9其中%1~%9表示命令行参数1-9,其中这行命令已经被PyQt封装成了E:\Python\program\Lib\site-packages\PyQt4\pyuic4.bat。具体的用法为:pyuic4 xx.ui -o xx.py。现在有个缺点就是pyuic4必须加入环境变量中,或者进入E:\Python\program\Lib\site-packages\PyQt4\中,这就不能在我们的当前代码目录下使用。解决方法:可以自己写一个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)

利用PyQt4写的小工具软件的更多相关文章

  1. [No00006C]文件名复制,归档小助手【自己写的小工具,希望能帮助大家】

    特别补充一句:软件可以一次性复制多个文件的文件名. Windows 中的复制文件名实在是有些不方便 ,需要点右键 "重命名"之后再点右键选择"复制"才可复制文件 ...

  2. 分享一个很早之前写的小工具DtSpyPlus

    几年前写的一个获取windows窗体基本信息和屏幕取色的小工具 ,一直在用. 下载地址 http://files.cnblogs.com/dint/SpyPlus.zip

  3. 应急分析异常通信的小思路和自己写的小工具(查询CNAME和A记录)

    一.背景: 在很多时候,应急会发现.卧槽,异常连接,只有一个域名或者IP. 怎么办?上防火墙看记录,查域名对应的记录累成狗,自己把之前的代码改了改,写了个小工具,一条命令查询DNS相关记录,也可以指定 ...

  4. 【转】VC6.0附带小工具软件一览

    )ActiveX Control Test Container称为"ActiveX 控件测试容器",顾名思义,此工具的主要功能就是测试ActiveX 控件,可以通过改变Active ...

  5. [原创小工具]软件内存、CPU使用率监视,应用程序性能监测器 v3.0 绿色版

    应用程序性能监测器 V3.0 更新内容:    1.对一些代码进行了修改,软件本身的性能有所提升. 应用程序性能监测器 V2.0 更新内容:     1.鼠标移动到曲线区域,显示相关的曲线值      ...

  6. 利用 Makefile 写的小程序

    1.建立一个工程 2.写一个进度条的程序(原理就是在同一位置重复打印某一个字符(变化),达到动态显示的效果) 所以说我们这里只用回车'\r',覆盖这一行以前的输出,重新向缓冲区写数据刷新缓冲区,就能达 ...

  7. 【OPPO主题制作系列 - 01】-- 写个小工具自动打包Theme文件

    参考OPPO主题设计师站: http://dev.theme.oppomobile.com/user/user_start 想要打包成Theme文件,必须把需要打包的文件夹拖到oppo-themepa ...

  8. Python写黑客小工具,360免杀

    构思: client:反向连接server,执行shell命令 server:发送命令,控制客户端 import subprocess import socket import threading t ...

  9. 入坑python 自己写的小工具,纪念一下

    这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...

随机推荐

  1. JS的replace()的应用

    替换字符串中的空格 /\s/ig 例如: var pro="ssss  ssss  sss ddd ss" var protext = pro.replace(/\s/ig,&qu ...

  2. The requested URL ***** was not found on this serve

    Wamp的Alias具体是干什么用的,后面要研究一下!!!! 我是之前创建了一个站点用Alias,后来把站点文件移到了www下后,除了首页都访问不了了.显示“The requested URL *** ...

  3. 用CSS3实现带小三角形的div框(不用图片)

    现在看到了很多带小三角形的方框,如微信.Mac版的QQ.QQ空间的时间轴等等,在聊天或者是发表的状态的内容外面都有一个带小三角形的矩形框包围着,感觉看着很不错,于是决定亲自动手写一个,我上次用的是偏移 ...

  4. Mac 安装maven3.3.9

    只记录一部分自己出错的内容 maven 3 与 jdk 版本的关系 之前安装的jdk是1.8 安装完maven(包括配置环境变量)之后,输入mvn -version 显示版本错误 ,百度之后发现是ma ...

  5. 查看library_cache 库缓冲区的命中率

    关于library cache的命中率:    SQL> desc V$librarycache    NAMESPACE                                     ...

  6. 关于Core Data的一些整理(五)

    关于Core Data的一些整理(五) 在Core Data中使用NSFetchedResultsController(以下简称VC)实现与TableView的交互,在实际中,使用VC有很多优点,其中 ...

  7. javascript 操作符类型隐性转换

    javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...

  8. JavaScript 的 OOP 功能解析

    根据JavaScript创始人Brandon Eich 自己的说法,JavaScript 最好的语言构造是: 函数是一等公民 (first class functions) 闭包 (closure) ...

  9. 【USACO 2.3.3】零数列

    [题目描述] 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于 ...

  10. 纯js制作遮罩层对话框 -- g皓皓

    //本文支持js在线工具测试.转载请注明出处. <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> < ...