# PyQt4 HardwareManager # 声明: # 本软件主要是由于朋友说想要一个产品缺陷记录软件,主要用于记录产品缺陷, # 通过产品序列号进行插入、查询,本来想用VC++ 6.0做,但是每次打开开发环境就 # 奔溃了,所以只能换一个开发环境,于是尝试用PyQt4进行原型开发,在开发过程中 # 发现,这确实是一个很好的思路,该软件可以换一种思路用于其他环境下,但就 # 目前而已,这仅仅是一个原型。 # # 2015-10-23 晴 深圳 南山平山村 曾剑锋 \\\\\\\\\\\\\-*- 目录 -*-//////////// | 一、cat main.pyw | 二、cat HardwareDialog.pyw | 三、cat Ui_HardwareManager.pyw | 四、cat hardwaremanager.ui | 五、cat autorun.bat | 六、cat readme.txt ------------------------------------ 一、cat main.pyw #coding=utf-8 # 参考文章: # 1. pyqt 使用 Qt Designer 设计的ui文件 # http://blog.csdn.net/lainegates/article/details/8656145 # 2. PyQt 4.11.4 Reference Guide Using Qt Designer # http://pyqt.sourceforge.net/Docs/PyQt4/designer.html # 3. Create dynamic button in PyQt # http://stackoverflow.com/questions/10730131/create-dynamic-button-in-pyqt # 4. How can I hide the console window in a PyQt app running on Windows? # http://stackoverflow.com/questions/466203/how-can-i-hide-the-console-window-in-a-pyqt-app-running-on-windows # 5. pyqt如何关闭dos窗口 # http://www.wosoni.com/osk/230860_91298.html import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from HardwareDialog import HardwareDialog def main(): app = QApplication(sys.argv) app.setWindowIcon(QIcon("./logo.ico")) hardwareDialog = HardwareDialog() hardwareDialog.show() sys.exit(app.exec_()) if __name__ == '__main__': main() 二、cat HardwareDialog.pyw #coding=utf-8 import sys import os import time from PyQt4.QtCore import * from PyQt4.QtGui import * import sqlite3 from ui_hardwaremanager import Ui_HardwareManager class HardwareDialog(QDialog): def __init__(self): QDialog.__init__(self) self.ui = Ui_HardwareManager() self.ui.setupUi(self) self.setWindowTitle("HardwareManager") self.setFixedHeight(self.height()) self.setFixedWidth(self.width()) self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint); # http://stackoverflow.com/questions/10730131/create-dynamic-button-in-pyqt # Error: TypeError: connect() slot argument should be a callable or a signal, not 'NoneType' # # Note the lambda will avoid the evaluation of the function call, so it'll call # self.commander(command) only when clicked # self.ui.insert.clicked.connect(lambda: self.insertData()) self.ui.insert.clicked.connect(self.insertData) self.ui.query.clicked.connect(self.queryData) self.ui.clean.clicked.connect(self.cleanData) self.cpFilePath = "" def insertData(self): # 这里必须这么处理一下才能将serial插入sqlite3数据,否则总是会报如下错误: # sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. serial = ("%s" % (self.ui.serial.text())).strip() filePath = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time())) # To prevent the string length is less than 0 if ( len(serial) > 0 ) : hmConnect = sqlite3.connect("./HardwareManager.db") cursor = hmConnect.cursor() cursor.execute('CREATE TABLE if not exists HardwareManager (id INTEGER PRIMARY KEY, serial VARCHAR(40), path VARCHAR(100))') # check serial NO. was only one cursor.execute('SELECT id, path from HardwareManager where serial = ?', [serial]) if ( cursor.fetchone() != None ) : QMessageBox.about(self, "ERROR","Please check the serial number is the only one") hmConnect.close() return # insert data argument=(serial, filePath) cursor.execute('INSERT INTO HardwareManager (id, serial, path) VALUES(NULL, ?, ?)', argument) hmConnect.commit() # save readme data readmeFilePath = "./managerFile/%s" % filePath os.makedirs(readmeFilePath) readme = open( "%s/readme.txt" % readmeFilePath, "w" ) readme.write(self.ui.readme.toPlainText()) readme.flush() readme.close() self.ui.id.setText( "%s" % cursor.lastrowid ) self.ui.path.setText("%s/readme.txt" % readmeFilePath) ## debug #print argument #cursor.execute('SELECT * FROM HardwareManager') #print cursor.fetchall() hmConnect.close() # mesage for costomer QMessageBox.about(self, "Mesg","Insert OK.") def queryData(self): serial = ("%s" % (self.ui.serial.text())).strip() if ( len(serial) > 0 ) : hmConnect = sqlite3.connect("./HardwareManager.db") cursor = hmConnect.cursor() # create data if HardwareManager table don't exists cursor.execute('CREATE TABLE if not exists HardwareManager (id INTEGER PRIMARY KEY, serial VARCHAR(40), path VARCHAR(100))') # check data cursor.execute('SELECT id, path from HardwareManager where serial = ?', [serial]) row = cursor.fetchone() if ( row == None ) : QMessageBox.about(self, "ERROR","Please check your serial number") hmConnect.close() return self.ui.id.setText( "%s" % row[0] ) self.ui.path.setText( "./managerFile/%s/readme.txt" % row[1] ) # maybe this file has lost if ( os.path.exists("./managerFile/%s/readme.txt" % row[1]) == True) : readme = open( "./managerFile/%s/readme.txt" % row[1] ) self.ui.readme.setPlainText(readme.read()) readme.close() else : QMessageBox.about(self, "Mesg","can't find the readme.txt file") hmConnect.close() def cleanData(self): ''' clean EditLine widget data ''' self.ui.id.setText("") self.ui.serial.setText("") self.ui.path.setText("") self.ui.readme.setPlainText("") 三、cat Ui_HardwareManager.pyw # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'E:\python\HardWareManager\hardwaremanager.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_HardwareManager(object): def setupUi(self, HardwareManager): HardwareManager.setObjectName(_fromUtf8("HardwareManager")) HardwareManager.resize(465, 300) self.verticalLayout_2 = QtGui.QVBoxLayout(HardwareManager) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.frame = QtGui.QVBoxLayout() self.frame.setObjectName(_fromUtf8("frame")) self.serialIDPath = QtGui.QGridLayout() self.serialIDPath.setSizeConstraint(QtGui.QLayout.SetNoConstraint) self.serialIDPath.setContentsMargins(20, -1, -1, -1) self.serialIDPath.setHorizontalSpacing(30) self.serialIDPath.setObjectName(_fromUtf8("serialIDPath")) self.label_path = QtGui.QLabel(HardwareManager) self.label_path.setAlignment(QtCore.Qt.AlignCenter) self.label_path.setObjectName(_fromUtf8("label_path")) self.serialIDPath.addWidget(self.label_path, 5, 0, 1, 1) self.label_id = QtGui.QLabel(HardwareManager) self.label_id.setAlignment(QtCore.Qt.AlignCenter) self.label_id.setObjectName(_fromUtf8("label_id")) self.serialIDPath.addWidget(self.label_id, 2, 0, 1, 1) self.pathClean = QtGui.QHBoxLayout() self.pathClean.setObjectName(_fromUtf8("pathClean")) self.path = QtGui.QLineEdit(HardwareManager) self.path.setObjectName(_fromUtf8("path")) self.pathClean.addWidget(self.path) self.clean = QtGui.QPushButton(HardwareManager) self.clean.setObjectName(_fromUtf8("clean")) self.pathClean.addWidget(self.clean) self.serialIDPath.addLayout(self.pathClean, 5, 1, 1, 1) self.label_serial = QtGui.QLabel(HardwareManager) self.label_serial.setAlignment(QtCore.Qt.AlignCenter) self.label_serial.setObjectName(_fromUtf8("label_serial")) self.serialIDPath.addWidget(self.label_serial, 1, 0, 1, 1) self.serial = QtGui.QLineEdit(HardwareManager) self.serial.setObjectName(_fromUtf8("serial")) self.serialIDPath.addWidget(self.serial, 1, 1, 1, 1) self.id = QtGui.QLineEdit(HardwareManager) self.id.setObjectName(_fromUtf8("id")) self.serialIDPath.addWidget(self.id, 2, 1, 1, 1) self.frame.addLayout(self.serialIDPath) self.insertQueryButton = QtGui.QHBoxLayout() self.insertQueryButton.setObjectName(_fromUtf8("insertQueryButton")) self.insert = QtGui.QPushButton(HardwareManager) self.insert.setObjectName(_fromUtf8("insert")) self.insertQueryButton.addWidget(self.insert) self.query = QtGui.QPushButton(HardwareManager) self.query.setObjectName(_fromUtf8("query")) self.insertQueryButton.addWidget(self.query) self.frame.addLayout(self.insertQueryButton) self.readme = QtGui.QPlainTextEdit(HardwareManager) self.readme.setObjectName(_fromUtf8("readme")) self.frame.addWidget(self.readme) self.verticalLayout_2.addLayout(self.frame) self.retranslateUi(HardwareManager) QtCore.QMetaObject.connectSlotsByName(HardwareManager) HardwareManager.setTabOrder(self.serial, self.id) HardwareManager.setTabOrder(self.id, self.path) HardwareManager.setTabOrder(self.path, self.insert) HardwareManager.setTabOrder(self.insert, self.query) HardwareManager.setTabOrder(self.query, self.readme) HardwareManager.setTabOrder(self.readme, self.clean) def retranslateUi(self, HardwareManager): HardwareManager.setWindowTitle(_translate("HardwareManager", "HardwareManager", None)) self.label_path.setText(_translate("HardwareManager", "Path:", None)) self.label_id.setText(_translate("HardwareManager", "ID:", None)) self.clean.setText(_translate("HardwareManager", "Clean", None)) self.label_serial.setText(_translate("HardwareManager", "Serial NO.:", None)) self.insert.setText(_translate("HardwareManager", "Insert", None)) self.query.setText(_translate("HardwareManager", "Query", None)) 四、cat hardwaremanager.ui <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>HardwareManager</class> <widget class="QDialog" name="HardwareManager"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>465</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>HardwareManager</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QVBoxLayout" name="frame"> <item> <layout class="QGridLayout" name="serialIDPath"> <property name="sizeConstraint"> <enum>QLayout::SetNoConstraint</enum> </property> <property name="leftMargin"> <number>20</number> </property> <property name="horizontalSpacing"> <number>30</number> </property> <item row="5" column="0"> <widget class="QLabel" name="label_path"> <property name="text"> <string>Path:</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_id"> <property name="text"> <string>ID:</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item row="5" column="1"> <layout class="QHBoxLayout" name="pathClean"> <item> <widget class="QLineEdit" name="path"/> </item> <item> <widget class="QPushButton" name="clean"> <property name="text"> <string>Clean</string> </property> </widget> </item> </layout> </item> <item row="1" column="0"> <widget class="QLabel" name="label_serial"> <property name="text"> <string>Serial NO.:</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="serial"/> </item> <item row="2" column="1"> <widget class="QLineEdit" name="id"/> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="insertQueryButton"> <item> <widget class="QPushButton" name="insert"> <property name="text"> <string>Insert</string> </property> </widget> </item> <item> <widget class="QPushButton" name="query"> <property name="text"> <string>Query</string> </property> </widget> </item> </layout> </item> <item> <widget class="QPlainTextEdit" name="readme"/> </item> </layout> </item> </layout> </widget> <tabstops> <tabstop>serial</tabstop> <tabstop>id</tabstop> <tabstop>path</tabstop> <tabstop>insert</tabstop> <tabstop>query</tabstop> <tabstop>readme</tabstop> <tabstop>clean</tabstop> </tabstops> <resources/> <connections/> </ui> 五、cat autorun.bat start pythonw.exe main.pyw exit 六、cat readme.txt 一、文件说明: 1. managerFile目录主要是程序生成的信息文件,不要去动它; 2. pyhon2.7目录包含了python2.7、pyqt4的安装文件; 3. autorun.bat是windows的批处理文件,双击运行,会自动main.pyw文件; 4. 所有的.pyw文件是python程序文件; 5. hardwaremanager.ui文件是qt Designer生成的文件,通过pyuic4.bat将ui文件转成ui_hardwaremanager.pyw; 6. logo.ico是程序的ico文件。 二、程序运行说明: 1. 可以通过双击main.pyw文件运行; 2. 可以通过双击autorun.bat文件运行。