Hier ist mein QT CodeFunktionszeiger über Klassen und Threads
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTime
from PyQt4.QtGui import QApplication
from keithley.PS2231A import PS2231A
class A(QtGui.QMainWindow, gui.Ui_MainWindow):
def __init__(self, parent=None):
super(A, self).__init__(parent)
self.setupUi(self)
ps = PS2231A(port='COM8')
self.refresh.clicked.connect(self.get_data)
def get_data(self):
data = ps.read_current()
self.current_measurement.setText(str(data))
def main():
app = QtGui.QApplication([])
form = A()
form.show()
app.exec()
if __name__ == '__main__':
main()
Hier ist meine PS2231A Bibliothek
class PS2231A:
def __init__(self, port: str):
self._port = port
self._dev = serial.Serial()
self._dev.port = self._port
self._dev.timeout = 5
self._dev.baudrate = 9600
self.connect()
self._dev.open()
def read_current(self):
self._dev.write('MEAS:CURR?')
current = self._dev.readline()
return float(current)
Hier ist, was ich erreichen möchte: Die Stromversorgung liefert Notfallmeldungen wie über Strom. Es endet im Wesentlichen damit, diese Nachricht an den seriellen Port zu schreiben, ohne dass ein Befehl Daten anfordert. Sobald diese Nachricht empfangen wird, möchte ich, dass sich die GUI ändert.
Scope: Hier schreibe ich die Bibliothek für PS2231A, und ein Benutzer wird eine GUI um es schreiben. Ich möchte eine librarieseitige Lösung, um die Nachricht an die GUI zu propagieren, hier ist, wie ich es mir vorstelle:
Schritt 1: Wenn ein Objekt von PS2231A erstellt wird, starten Sie einen Thread, der die serielle Schnittstelle lesen wird für Nachrichten. Sobald die Notfallnachricht gelesen wurde, ruft sie eine Funktion in der Bibliothek auf. Schritt 2: Die vom Thread aufgerufene Funktion sollte alle vom Benutzer gewünschten Funktionen ausführen, dh wenn der Benutzer den GUI-Hintergrund in Rot umwandeln möchte, schreibt der Benutzer den Code in eine Funktion namens turn_background_red, übergibt den Funktionsnamen an die Bibliotheksfunktion. Dann führt die Bibliotheksfunktion den Code immer dann aus, wenn die Notfallnachricht aufgerufen wird.
Ich denke, der Code darunter auch erklären (ich dies geschehen soll, so dass einige Code funktioniert nicht):
QT-Code
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTime
from PyQt4.QtGui import QApplication
from keithley.PS2231A import PS2231A
class A(QtGui.QMainWindow, gui.Ui_MainWindow):
def __init__(self, parent=None):
super(A, self).__init__(parent)
self.setupUi(self)
ps = PS2231A(port='COM8')
ps.set_over_current_callback(self.warn_user)
self.refresh.clicked.connect(self.get_data)
def warn_user(self):
# manipulate some GUI element
# implemented by user
def get_data(self):
data = ps.read_current()
self.current_measurement.setText(str(data))
def main():
app = QtGui.QApplication([])
form = A()
form.show()
app.exec()
if __name__ == '__main__':
main()
Klasse Code-Implementierung
class PS2231A:
def __init__(self, port: str):
self._port = port
self._dev = serial.Serial()
self._dev.port = self._port
self._dev.timeout = 5
self._dev.baudrate = 9600
self.connect()
self._dev.open()
def read_current(self):
self._dev.write('MEAS:CURR?')
current = self._dev.readline()
return float(current)
def set_over_current_callback(self, function_name):
# write some code to run the function name passed to this function
# This is the code I am not sure how to go ahead with
# This function will be executed if an emergency message is received
# on serial port
Einige kritische Herausforderungen, denen ich dabei gegenüberstand, waren, dass die auszuführende Funktion in einer anderen Klasse ist.
Wenn Sie feststellen, dass Ihre Frage in einem ersten Entwurf nicht klar ist, müssen Sie die Frage nicht wirklich * posten *. Mach einfach weiter, bis du denkst, dass es klar und bereit zum Lesen ist. –
Code anzeigen. Das ist so vage, dass Sie uns grundsätzlich bitten, das Projekt für Sie zu schreiben. –
An dieser Stelle haben Sie jedoch keine * konkrete, umsetzbare Frage * in Ihrem Beitrag. Stack Overflow eignet sich nicht wirklich für vage Architektur-Brainstorming-Fragen, tut mir leid. –