生成 .exe 时条形码图像生成不起作用[重复]

问题描述 投票:0回答:1

我有这个 PyQt5 自定义小部件:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QGraphicsScene
from PyQt5.QtGui import QPixmap,QImage
from .MostrarBarcode import MostrarBarcode
import barcode
from barcode.writer import ImageWriter
from PIL import Image
import io


class ResponsiveDataWidget(QWidget):

    def mousePressEvent(self, event):
        self.mostrarBarcode()

    def __init__(self,datos,botonEditar,botonEliminar,botonReponer,anchoTabla,indiceBarcode):
        super().__init__()
        self.datos = datos
        self.cantidadBotones = 0
        self.hayBotonEditar = False
        self.hayBotonEliminar = False
        self.hayBotonReponer = False
        self.indiceBarcode = indiceBarcode
        if botonEditar:
            self.hayBotonEditar = True
            self.cantidadBotones = self.cantidadBotones+1
        if botonEliminar:
            self.hayBotonEliminar = True
            self.cantidadBotones = self.cantidadBotones+1
        if botonReponer:
            self.hayBotonReponer = True
            self.cantidadBotones = self.cantidadBotones+1
        espacioBotones = self.cantidadBotones*30
        self.anchoWidget = anchoTabla-25 # restamos 25 para dar espacio al scrollbar
        self.anchoRegistro = int(((self.anchoWidget-espacioBotones)/len(datos))-3) #restamos 3 para dar espacio a los separadores
        self.labels = []
        self.setupUi(self)

    def generar_codigo_barras(self,numero):
        # Genera el código de barras
        codigo = barcode.get('code39', numero, writer=ImageWriter())
        # Guarda el código de barras en un archivo
        ruta_temporal = codigo.save('codigo_barras_temp')
        imagen = Image.open(ruta_temporal)
        redim_imagen = imagen.resize((190,100),Image.Resampling.LANCZOS)

        ruta_imagen = 'codigo_barras.png'
        redim_imagen.save(ruta_imagen)

        return ruta_imagen

    def mostrarBarcode(self):
        if self.indiceBarcode!=None:
            self.widgetBarcode = MostrarBarcode()
            scene = QGraphicsScene(self.widgetBarcode.barcodePlaceholder)
            self.widgetBarcode.barcodePlaceholder.setScene(scene)
            pixmap = QPixmap(self.generar_codigo_barras(self.labels[self.indiceBarcode].text().strip()))
            scene.addPixmap(pixmap)
            self.widgetBarcode.show()


    def self_destruct(self):
        if self.layout() is not None:
            while self.layout().count():
                child = self.layout().takeAt(0)
                if child.widget() is not None:
                    child.widget().deleteLater()
        self.setParent(None)
        self.deleteLater()

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setFixedSize(self.anchoWidget, 30)

        x = 0
        for i in range(len(self.datos)):
            label = QtWidgets.QLabel(Form)
            label.setGeometry(QtCore.QRect(x, 0, self.anchoRegistro, 30))
            label.setText("   "+str(self.datos[i]))
            x = x + self.anchoRegistro
            self.labels.append(label)
            separador = QtWidgets.QFrame(Form)
            separador.setGeometry(QtCore.QRect(x, 0, 3, 30))
            separador.setFrameShape(QtWidgets.QFrame.VLine)
            separador.setFrameShadow(QtWidgets.QFrame.Sunken)
            x = x+3

        if self.hayBotonEliminar:
            self.butEliminar = QtWidgets.QPushButton(Form)
            self.butEliminar.setGeometry(QtCore.QRect(x,0,30,30))
            self.butEliminar.setStyleSheet("background:red;font-size:20px")
            self.butEliminar.setText("x")
            self.butEliminar.clicked.connect(self.self_destruct)
            x = x + 30

        if self.hayBotonReponer:
            self.butReponer = QtWidgets.QPushButton(Form)
            self.butReponer.setGeometry(QtCore.QRect(x, 0, 30, 30))
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(15)
            self.butReponer.setFont(font)
            self.butReponer.setStyleSheet("background-color:cyan;color:white")
            self.butReponer.setObjectName("butReponer")
            self.butReponer.setText("+")
            x  = x + 30

        if self.hayBotonEditar:
            self.butEditar = QtWidgets.QPushButton(Form)
            self.butEditar.setGeometry(QtCore.QRect(x, 0, 30, 30))
            font = QtGui.QFont()
            font.setFamily("Arial")
            font.setPointSize(8)
            self.butEditar.setFont(font)
            self.butEditar.setStyleSheet("background-color:lightgreen;color:green")
            self.butEditar.setText("edit")
            self.butEditar.setObjectName("butEditar")

            
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = ResponsiveDataWidget(["hola","adios","buenas","tardes","amigo","qué tal"],True,True,True,500)
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

这是 MostrarBarcode 类:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget


class MostrarBarcode(QWidget):

    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(190, 130)

        self.barcodePlaceholder = QtWidgets.QGraphicsView(Form)
        self.barcodePlaceholder.setGeometry(QtCore.QRect(0, 0, 190, 100))
        self.barcodePlaceholder.setObjectName("barcodePlaceholder")

        self.butDescargar = QtWidgets.QPushButton(Form)
        self.butDescargar.setGeometry(QtCore.QRect(115, 100, 75, 30))
        self.butDescargar.setObjectName("butDescargar")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.butDescargar.setText(_translate("Form", "descargar"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = MostrarBarcode()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

项目更大,所以我无法教授所有课程,但我的问题在于这两门课程。我的问题是,当通过“python app.py”执行我的应用程序时,此类按预期工作:单击“ResponsiveDataWidget”时,会显示一个“MostrarBarcode”窗口,其中包含生成的条形码的图像。 但是当我使用“pyinstaller --onefile app.py”生成项目的.exe并通过.exe执行应用程序时,它会出现以下错误:

OSError: cannot open resource
关于 generic_codigo_barras 函数。我在这里迷路了。

我尝试了其他编译方法,但都不起作用。我想坚持使用 pyinstaller,因为它似乎是最简单、最快的使用方式。

python pyqt5 pyinstaller python-barcode
1个回答
0
投票

您似乎正在“generar_codigo_barras”函数中创建一个新文件。当您编译为 exe 时,它可能会尝试创建二维码,但出于安全/完整性原因,我不相信您可以在可执行文件中创建新文件,您可能必须在用户的临时文件夹中创建二维码。 如何使用python保存临时jpg文件?

您可以使用 print() 函数添加一些健全性检查,以确保一切正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.