Pycharm Debugger funktioniert unter Ubuntu, aber nicht unter Windows für identischen Code
Aktualisieren Problem wird verfolgtHie
Bearbeiten Ich bin möglicherweise nicht der einzige mit diesem Problem. Ich habe das verpasst, was auch heute gepostet wurde und es sieht ähnlich aus: PyCharm Debugger funktioniert nicht
Below ist ein minimales Beispiel, das sowohl unter Windows 7 als auch unter Ubuntu 14.04 gut läuft, wenn Pycharm Professional verwendet wird.
PyCharm 2016.1
Build #PY-145.260, built on March 22, 2016
JRE: 1.8.0_60-b27 x86
JVM: Java HotSpot(TM) Server VM by Oracle Corporation
Nun der komische Teil: Auf Ubuntus Pycharm-Debugger bekomme ich kein Problem. Im Pycharm-Debugger von Windows erhalte ich jedoch den folgenden Traceback (obwohl der Code einwandfrei läuft, wenn er nicht debuggt!):
Traceback (most recent call last):
File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 1530, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 937, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "C:/Users/Cornelis/PycharmProjects/SO-Help/test.py", line 11, in <module>
class MainWindow(QtGui.QMainWindow):
File "C:/Users/Cornelis/PycharmProjects/SO-Help/test.py", line 58, in MainWindow
@QtCore.pyqtSlot(int, int)
AttributeError: 'module' object has no attribute 'pyqtSlot'
Backend TkAgg is interactive backend. Turning interactive mode on.
Ich weiß nicht einmal, wie ich sollStardebugging seit ich noch nie so etwas gesehen habe! Was in aller Welt bedeutet es, wenn Ihr Programm funktioniert, wenn Sie es ausführen, aber nicht, wenn Sie versuchen, es zu debuggen, und darüber hinaus, dass es auf einem anderen Betriebssystem problemlos debuggt? Kann das nur ein Pycharm-Fehler sein? Der obige Traceback ist nicht genau mit dem identisch, was ich in meinem Hauptprogramm erhalte, ist aber der bestmögliche. Unten ist der Traceback, den ich in meinem vollständigen Programm sehe:
Backend TkAgg is interactive backend. Turning interactive mode on.
Traceback (most recent call last):
File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 1530, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\Program Files (x86)\JetBrains\PyCharm 2016.1\helpers\pydev\pydevd.py", line 937, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:/Home/Documents/PycharmProjects/BMDanalyse/BMDanalyse/SPCanalyse.py", line 22, in <module>
from ViewBoxCustom import MultiRoiViewBox, ImageAnalysisViewBox
File "D:/Home/Documents/PycharmProjects/BMDanalyse/BMDanalyse\ViewBoxCustom.py", line 68, in <module>
class MultiRoiViewBox(pg.ViewBox):
File "D:/Home/Documents/PycharmProjects/BMDanalyse/BMDanalyse\ViewBoxCustom.py", line 71, in MultiRoiViewBox
clicked = QtCore.pyqtSignal(int, int)
AttributeError: 'module' object has no attribute 'pyqtSignal'
Hier ist dein minimales Beispiel. Einfach kopieren und einfügen und auf die ViewBox klicken. Ein zufälliges Bild sollte angezeigt werden, wenn Sie es ausführen. Aber wenn Sie es debuggen, explodiert es.
import os, sys, matplotlib, matplotlib.pyplot
import numpy as np
from pyqtgraph.Qt import QtCore, QtGui
from pyqtgraph.widgets.GraphicsLayoutWidget import GraphicsLayoutWidget
import pyqtgraph as pg
import pyqtgraph.functions as fn
N = 256
ARR = np.random.random((N,N))*255
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUserInterface()
self.setupSignals()
def setupUserInterface(self):
""" Initialise the User Interface """
# Left frame
leftFrame = QtGui.QFrame()
leftFrameLayout = QtGui.QHBoxLayout()
leftFrame.setLayout(leftFrameLayout)
leftFrame.setLineWidth(0)
leftFrame.setFrameStyle(QtGui.QFrame.Panel)
leftFrameLayout.setContentsMargins(0,0,5,0)
# Left frame contents
self.viewMain = GraphicsLayoutWidget() # A GraphicsLayout within a GraphicsView
leftFrameLayout.addWidget(self.viewMain)
self.viewMain.setMinimumSize(200,200)
self.vb = MultiRoiViewBox(lockAspect=True,enableMenu=True)
self.viewMain.addItem(self.vb)
self.vb.enableAutoRange()
# Right frame
self.sidePanel = SidePanel(self)
# UI window (containing left and right frames)
UIwindow = QtGui.QWidget(self)
UIwindowLayout = QtGui.QHBoxLayout()
UIwindowSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
UIwindowLayout.addWidget(UIwindowSplitter)
UIwindow.setLayout(UIwindowLayout)
self.setCentralWidget(UIwindow)
UIwindowSplitter.addWidget(leftFrame)
UIwindowSplitter.addWidget(self.sidePanel)
self.setMinimumSize(600,500)
self.resize(self.minimumSize())
def setupSignals(self):
""" Setup signals """
# self.sidePanel.buttImageAdd.clicked.connect(self.showImage)
self.vb.clicked.connect(self.on_vbc_clicked)
@QtCore.pyqtSlot(int, int)
def on_vbc_clicked(self, x, y):
print(x)
print(y)
self.showImage()
def showImage(self):
""" Shows image in main view """
self.vb.showImage(ARR)
class ViewMode():
def __init__(self,id,cmap):
self.id = id
self.cmap = cmap
self.getLookupTable()
def getLookupTable(self):
lut = [ [ int(255*val) for val in self.cmap(i)[:3] ] for i in xrange(256) ]
lut = np.array(lut,dtype=np.ubyte)
self.lut = lut
class MultiRoiViewBox(pg.ViewBox):
sigROIchanged = QtCore.Signal(object)
clicked = QtCore.pyqtSignal(int, int)
def __init__(self,parent=None,border=None,lockAspect=False,enableMouse=True,invertY=False,enableMenu=True,name=None):
pg.ViewBox.__init__(self,parent,border,lockAspect,enableMouse,invertY,enableMenu,name)
self.img = None
self.NORMAL = ViewMode(0,matplotlib.cm.gray)
self.DEXA = ViewMode(1,matplotlib.cm.jet)
self.viewMode = self.NORMAL
def showImage(self,arr):
if arr==None:
self.img = None
return
if self.img==None:
self.img = pg.ImageItem(arr,autoRange=False,autoLevels=False)
self.addItem(self.img)
self.img.setImage(arr,autoLevels=False)
self.updateView()
def updateView(self):
self.background.setBrush(fn.mkBrush(self.viewMode.lut[0]))
self.background.show()
if self.img==None: return
else: self.img.setLookupTable(self.viewMode.lut)
def mouseClickEvent(self, ev):
if ev.button() == QtCore.Qt.RightButton and self.menuEnabled():
ev.accept()
self.raiseContextMenu(ev)
elif ev.button() == QtCore.Qt.LeftButton:
ev.accept()
pos = self.mapToItem(self.img, ev.pos())
self.clicked.emit(pos.x(), pos.y())
from pyqtgraph.Qt import QtCore,QtGui
class SidePanel(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self,parent)
self.setMinimumWidth(250)
self.buttMinimumSize = QtCore.QSize(36,36)
self.setupImageToolbox()
sidePanelLayout = QtGui.QVBoxLayout()
sidePanelLayout.addWidget(self.imageToolbox)
sidePanelLayout.setContentsMargins(0,0,0,0)
self.setLayout(sidePanelLayout)
def setupImageToolbox(self):
# Image buttons
self.buttImageAdd = QtGui.QPushButton()
imageButtons = [self.buttImageAdd]
for i in xrange(len(imageButtons)):
image = imageButtons[i]
image.setMinimumSize(self.buttMinimumSize)
self.imageFileTools = QtGui.QFrame()
imageFileToolsLayout = QtGui.QHBoxLayout()
self.imageFileTools.setLayout(imageFileToolsLayout)
self.imageFileTools.setLineWidth(1)
self.imageFileTools.setFrameStyle(QtGui.QFrame.StyledPanel)
imageFileToolsLayout.addWidget(self.buttImageAdd)
# Image Toolbox (containing imageFileList + imageFileList buttons)
self.imageToolbox = QtGui.QFrame()
self.imageToolbox.setLineWidth(2)
self.imageToolbox.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised)
imageToolboxLayout = QtGui.QVBoxLayout()
self.imageToolbox.setLayout(imageToolboxLayout)
imageToolboxLayout.addWidget(self.imageFileTools)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())