我有这个 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,因为它似乎是最简单、最快的使用方式。
您似乎正在“generar_codigo_barras”函数中创建一个新文件。当您编译为 exe 时,它可能会尝试创建二维码,但出于安全/完整性原因,我不相信您可以在可执行文件中创建新文件,您可能必须在用户的临时文件夹中创建二维码。 如何使用python保存临时jpg文件?
您可以使用 print() 函数添加一些健全性检查,以确保一切正常工作。