Ich arbeite gerade an einem Programm für automatisierte Kalibrationsprozeduren. Dafür habe ich etliche python-files in denen sequentiell diverse Geräte per visa angesprochen werden und Werte eingelesen werden. Ich habe dazu ein GUI erstellt, welches, unter anderem, ein QTextEdit enthält auf dem der stdout-stream ausgegeben wird. Mit einem Button führe ich die Kalibrations-files mit execfile("bsp.py") aus. Für die Ausgabe am QTextEdit habe ich mich an das Beispiel von stackoverflow gehalten. Dort wird mit QThread gearbeitet. Ich hab bei mir die Ausführung von meinen Kalibrations-files in einen eigenen Thread gepackt.
Mein Problem ist jetzt folgendes: In diesen Kalibrations-files möchte ich mit QInputDialog bzw. QMessageBox auf User-Kommandos warten. Aber das Aufrufen von QInputDialog bzw. QMessageBox führt zu einem Application Error mit dem Thread:
Der Fehler tritt auch nicht immer auf, sondern manchmal nach dem 10ten mal aufrufen oder manchmal gleich beim ersten Mal.The instruction at "0x67102405" referenced memory at "0x000000010". The memory coud not be "written".
Hier ist ein Programm, was dem eigentlichen Programm nachempfunden ist, bei dem der Fehler auch auftritt.
Code: Alles auswählen
import sys
from Queue import Queue
from PyQt4.Qt import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class test(QMainWindow):
def __init__(self,*args):
QMainWindow.__init__(self,*args)
self.btn1 = QPushButton('TEST',self)
self.btn1.setGeometry(QRect(10,10,80,30))
self.btn1.clicked.connect(self.start_thread)
self.Text = QTextEdit(self)
self.Text.setGeometry(0,80,220,50)
def Output(self, text):
cursor = self.Text.textCursor()
cursor.movePosition(QTextCursor.End)
cursor.insertText(text)
self.Text.setTextCursor(cursor)
self.Text.ensureCursorVisible()
@pyqtSlot(str)
def append_text(self,text):
self.Text.moveCursor(QTextCursor.End)
self.Text.insertPlainText( text )
@pyqtSlot()
def start_thread(self):
self.thread = QThread()
self.writeObject = ex(self)
self.writeObject.moveToThread(self.thread)
self.thread.started.connect(self.writeObject.run)
self.thread.start()
class ex(QObject):
def __init__(self,mainW,parent=None):
QObject.__init__(self,parent)
self.mainW = mainW
@pyqtSlot()
def run(self):
execfile("module2.py")
class Receiver(QObject):
mysignal = pyqtSignal(str)
def __init__(self,queue,*args,**kwargs):
QObject.__init__(self,*args,**kwargs)
self.queue = queue
@pyqtSlot()
def run(self):
while True:
text = self.queue.get()
self.mysignal.emit(text)
class WriteStream(object):
def __init__(self,queue):
self.queue = queue
def write(self,text):
self.queue.put(text)
class App(QApplication):
def __init__(self, *args):
QApplication.__init__(self,*args)
self.main = test()
self.main.setGeometry(QRect(100,100,220,130))
self.main.show()
queue = Queue()
sys.stdout = WriteStream(queue)
app = App(sys.argv)
thread = QThread()
my_receiver = Receiver(queue)
my_receiver.mysignal.connect(app.main.append_text)
my_receiver.moveToThread(thread)
thread.started.connect(my_receiver.run)
thread.start()
app.exec_()
Code: Alles auswählen
#.......#
x, ok = QInputDialog.getText(self.mainW,'MEssage','Enter:')
if ok:
print (x)
#.......#
Ich hoffe Ihr könnt mir weiter helfen, bin scho ziemlich verzweifelt, weil ich nirgendwo etwas dazu finde.
Vielen Dank schon im Voraus
