Ошибка : QWidget: Must construct a QApplication before a QWidget
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.opengl as gl
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import numpy as np
from stl import mesh
from pathlib import Path
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.setGeometry(0, 0, 700, 900)
self.setAcceptDrops(True)
self.initUI()
self.currentSTL = None
self.lastDir = None
self.droppedFilename = None
def initUI(self):
centerWidget = QWidget()
self.setCentralWidget(centerWidget)
layout = QVBoxLayout()
centerWidget.setLayout(layout)
self.viewer = gl.GLViewWidget()
layout.addWidget(self.viewer, 1)
self.viewer.setWindowTitle('STL Viewer')
self.viewer.setCameraPosition(distance=40)
g = gl.GLGridItem()
g.setSize(200, 200)
g.setSpacing(5, 5)
self.viewer.addItem(g)
btn = QPushButton(text="Load STL")
btn.clicked.connect(self.showDialog)
btn.setFont(QFont("Ricty Diminished", 14))
layout.addWidget(btn)
def showDialog(self):
directory = Path("")
if self.lastDir:
directory = self.lastDir
fname = QFileDialog.getOpenFileName(self, "Open file", str(directory), "STL (*.stl)")
if fname[0]:
self.showSTL(fname[0])
self.lastDir = Path(fname[0]).parent
def showSTL(self, filename):
if self.currentSTL:
self.viewer.removeItem(self.currentSTL)
points, faces = self.loadSTL(filename)
meshdata = gl.MeshData(vertexes=points, faces=faces)
mesh = gl.GLMeshItem(meshdata=meshdata, smooth=True, drawFaces=False, drawEdges=True, edgeColor=(0, 1, 0, 1))
self.viewer.addItem(mesh)
self.currentSTL = mesh
def loadSTL(self, filename):
m = mesh.Mesh.from_file(filename)
shape = m.points.shape
points = m.points.reshape(-1, 3)
faces = np.arange(points.shape[0]).reshape(-1, 3)
return points, faces
def dragEnterEvent(self, e):
print("enter")
mimeData = e.mimeData()
mimeList = mimeData.formats()
filename = None
if "text/uri-list" in mimeList:
filename = mimeData.data("text/uri-list")
filename = str(filename, encoding="utf-8")
filename = filename.replace("file:///", "").replace("\r\n", "").replace("%20", " ")
filename = Path(filename)
if filename.exists() and filename.suffix == ".stl":
e.accept()
self.droppedFilename = filename
else:
e.ignore()
self.droppedFilename = None
def dropEvent(self, e):
if self.droppedFilename:
self.showSTL(self.droppedFilename)
if __name__ == '__main__':
app = QtWidgets.QApplication([])
window = MyWindow()
window.show()
app.exec_()
Источник: Stack Overflow на русском