代码之家  ›  专栏  ›  技术社区  ›  ecjb

无法使用PyQt5和PyInstaller构建应用程序

  •  0
  • ecjb  · 技术社区  · 6 年前
    • MacOS 10.14
    • Python 3.7.1
    • PyInstaller pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip 2019年9月24日

    PyQt5 . 我可以用下面的小脚本成功地做到这一点( 脚本1 ):在cd脚本所在的目录之后,我只运行 PyInstaller script.py . 然后它构建了应用程序,我可以在新创建的子目录中找到可执行文件 path/to/script/dist/script/ 在这个目录中有一个可执行文件,你可以双击它运行应用程序。然后我试着用一个更大的剧本做同样的事( 脚本2 image_viewer_24_02_2019.py 对于错误消息)我找到了 there . 然后我尝试运行可执行文件(在 路径/到/脚本/距离/脚本/ )但我有以下几点 . 在构建 脚本2 ?

    pip安装https://github.com/pyinstaller/pyinstaller/archive/develop.zip

    以下是顺序: 脚本1 (可以成功建造), 脚本2 (无法建造)及其 :

    import sys
    from PyQt5 import QtCore, QtWidgets
    from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget
    from PyQt5.QtCore import QSize
    
    class HelloWindow(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
    
            self.setMinimumSize(QSize(640, 480))
            self.setWindowTitle("Hello world")
    
            centralWidget = QWidget(self)
            self.setCentralWidget(centralWidget)
    
            gridLayout = QGridLayout(self)
            centralWidget.setLayout(gridLayout)
    
            title = QLabel("Hello World from PyQt", self)
            title.setAlignment(QtCore.Qt.AlignCenter)
            gridLayout.addWidget(title, 0, 0)
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        mainWin = HelloWindow()
        mainWin.show()
        sys.exit( app.exec_() )
    

    脚本2

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class PhotoViewer(QtWidgets.QGraphicsView):
        photoClicked = QtCore.pyqtSignal(QtCore.QPoint)
    
        def __init__(self, parent):
            super(PhotoViewer, self).__init__(parent)
            self._zoom = 0
            self._empty = True
            self._scene = QtWidgets.QGraphicsScene(self)
            self._photo = QtWidgets.QGraphicsPixmapItem()
            self._scene.addItem(self._photo)
            self.setScene(self._scene)
            self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
            self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
            self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30)))
            self.setFrameShape(QtWidgets.QFrame.NoFrame)
    
        def hasPhoto(self):
            return not self._empty
    
        def fitInView(self, scale=True):
            rect = QtCore.QRectF(self._photo.pixmap().rect())
            if not rect.isNull():
                self.setSceneRect(rect)
                if self.hasPhoto():
                    unity = self.transform().mapRect(QtCore.QRectF(0, 0, 1, 1))
                    self.scale(1 / unity.width(), 1 / unity.height())
                    viewrect = self.viewport().rect()
                    scenerect = self.transform().mapRect(rect)
                    factor = min(viewrect.width() / scenerect.width(),
                                 viewrect.height() / scenerect.height())
                    self.scale(factor, factor)
                self._zoom = 0
    
        def setPhoto(self, pixmap=None):
            self._zoom = 0
            if pixmap and not pixmap.isNull():
                self._empty = False
                self.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag)
                self._photo.setPixmap(pixmap)
            else:
                self._empty = True
                self.setDragMode(QtWidgets.QGraphicsView.NoDrag)
                self._photo.setPixmap(QtGui.QPixmap())
            self.fitInView()
    
        def wheelEvent(self, event):
            if self.hasPhoto():
                if event.angleDelta().y() > 0:
                    factor = 1.25
                    self._zoom += 1
                else:
                    factor = 0.8
                    self._zoom -= 1
                if self._zoom > 0:
                    self.scale(factor, factor)
                elif self._zoom == 0:
                    self.fitInView()
                else:
                    self._zoom = 0
    
        def toggleDragMode(self):
            if self.dragMode() == QtWidgets.QGraphicsView.ScrollHandDrag:
                self.setDragMode(QtWidgets.QGraphicsView.NoDrag)
            elif not self._photo.pixmap().isNull():
                self.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag)
    
        def mousePressEvent(self, event):
            if self._photo.isUnderMouse():
                self.photoClicked.emit(QtCore.QPoint(event.pos()))
            super(PhotoViewer, self).mousePressEvent(event)
    
    
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super(Window, self).__init__()
            self.viewer = PhotoViewer(self)
            # 'Load image' button
            self.btnLoad = QtWidgets.QToolButton(self)
            self.btnLoad.setText('Load image')
            self.btnLoad.clicked.connect(self.loadImage)
            # Button to change from drag/pan to getting pixel info
            self.btnPixInfo = QtWidgets.QToolButton(self)
            self.btnPixInfo.setText('Enter pixel info mode')
            self.btnPixInfo.clicked.connect(self.pixInfo)
            self.editPixInfo = QtWidgets.QLineEdit(self)
            self.editPixInfo.setReadOnly(True)
            self.viewer.photoClicked.connect(self.photoClicked)
            # Arrange layout
            VBlayout = QtWidgets.QVBoxLayout(self)
            VBlayout.addWidget(self.viewer)
            HBlayout = QtWidgets.QHBoxLayout()
            HBlayout.setAlignment(QtCore.Qt.AlignLeft)
            HBlayout.addWidget(self.btnLoad)
            HBlayout.addWidget(self.btnPixInfo)
            HBlayout.addWidget(self.editPixInfo)
            VBlayout.addLayout(HBlayout)
    
        def loadImage(self):
            self.viewer.setPhoto(QtGui.QPixmap('image.jpg'))
    
        def pixInfo(self):
            self.viewer.toggleDragMode()
    
        def photoClicked(self, pos):
            if self.viewer.dragMode()  == QtWidgets.QGraphicsView.NoDrag:
                self.editPixInfo.setText('%d, %d' % (pos.x(), pos.y()))
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setGeometry(500, 300, 800, 600)
        window.show()
        sys.exit(app.exec_())
    

    错误消息 脚本2 )

    Last login: Sun Feb 24 14:39:36 on ttys001
    You have new mail.
    -bash: /usr/local/bin/virtualenvwrapper.sh: No such file or directory
    /Users/mymac/Documents/PyQt/image_viewer_24_02_2019/build/image_viewer_24_02_2019/image_viewer_24_02_2019 ; exit;
    (base) mymacs-MacBook-Pro:~ mymac$ /Users/mymac/Documents/PyQt/image_viewer_24_02_2019/build/image_viewer_24_02_2019/image_viewer_24_02_2019 ; exit;
    [45194] Error loading Python lib '/Users/mymac/Documents/PyQt/image_viewer_24_02_2019/build/image_viewer_24_02_2019/libpython3.7m.dylib': dlopen: dlopen(/Users/mymac/Documents/PyQt/image_viewer_24_02_2019/build/image_viewer_24_02_2019/libpython3.7m.dylib, 10): image not found
    logout
    Saving session...
    ...copying shared history...
    ...saving history...truncating history files...
    ...completed.
    
    [Process completed]
    
    0 回复  |  直到 6 年前