pyqt
用py2exe打包pyQt4
#!/usr/bin/python # coding=utf8 import sys from PyQt4.QtGui import QWidget, QLabel, QLineEdit, QHBoxLayout , QApplication from PyQt4.QtCore import * #不加py2exe时会报缺QtCore模块的错误 app = QApplication(sys.argv) w = QWidget() label = QLabel("Name:") w.resize(250, 150) w.move(300, 300) editor = QLineEdit() layout = QHBoxLayout(w) layout.addWidget(label) layout.addWidget(editor) w.show() sys.exit(app.exec_())
setup.py:
# coding=utf8 # setup.py from distutils.core import setup import py2exe,glob script = [{ "script" : "src/main.py", "icon_resources": [(1, "res/app.ico")] }] py2exe_options = { "compressed":1, #大大减小体积,upx无法替代 "optimize":2, "bundle_files":2, #所有dll,pyd都打包到exe "dll_excludes":["MSVCP90.dll"], "includes":["sip"] } files=[ ("res", glob.glob("res/*.*")), (".",glob.glob("dlls/*.*")), ] setup( windows=script, data_files=files, options={'py2exe':py2exe_options}, zipfile=None, #不生成libraray.zip )
必须附加的捆绑DLL: dlls ( Microsoft.VC90.CRT.manifest msvcp90.dll msvcr90.dll)
在win下配置所需环境环境并生成exe
- 安装python
- 安装py2exe
- 安装pyqt4
- 设置python的环境变量
-
在setup.py所在目录运行下面的bat脚本
make.bat
python setup.py py2exe rmdir /S /Q build dist\main.exe
技巧
tree实现多栏列表
-
创建
def buildList(self): m = MyTreeWidget(self) m.setColumnCount(2) sl = QStringList() sl.append('id') sl.append(u'值') m.setHeaderLabels(sl) global qFrame attrs = qFrame.client.showarea.curPic[0].attrs for attr in attrs: sid = str(attr[0]) + ' ' + qFrame.proj.attrVerbose(attr[0]) sl = QStringList() sl.append(sid) sl.append(str(attr[1])) item=QTreeWidgetItem(sl) item.setFlags(item.flags()|Qt.ItemIsEditable) m.addTopLevelItem(item) return m
-
读取
item = self.list.topLevelItem(0) while item: s1 = unicode(item.text(0)) s2 = unicode(item.text(1)) if s1 and s2: try: id = int(s1.split()[0]) #取id v = int(s2) attrs.append((id,v)) except ValueError: QMessageBox.critical(self,'X',u'请输入整数') return item = self.list.itemBelow(item)
右键删除菜单
class MyTreeWidget(QTreeWidget): def __init__(self,parent=None): super(MyTreeWidget, self).__init__(parent) self.itemPressed.connect(self.click) def click(self,item,index): if qApp.mouseButtons() == Qt.RightButton: m=QMenu() ac=QAction(u'删除',item.treeWidget()) ac.triggered.connect(self.delete) m.addAction(ac) m.exec_(QCursor.pos()) def delete(self): self.takeTopLevelItem(self.indexOfTopLevelItem(self.currentItem()))
双击某一栏不出现可编辑
class PathTreeWidget(MyTreeWidget): def __init__(self,parent=None): super(PathTreeWidget, self).__init__(parent) self.itemDoubleClicked.connect(self.dclick) def dclick(self,item,index): if index == 1: default = config.cfg['lastimgdir'] fname = unicode(QtGui.QFileDialog.getOpenFileName(self, u'选择图片...',default)) if fname: config.cfg['lastimgdir'] = os.path.dirname(fname)[:] item.setText(1,fname) else: #防止index=1时出现麻烦的可编辑,添加item时不要添加editable的flag item.setFlags(item.flags()|Qt.ItemIsEditable) self.editItem(item,index) item.setFlags(item.flags() & ~Qt.ItemIsEditable )