Hallo zusammen ich bin der Micha und bin ein absoluter Python Neuling.
Ich habe in QT eine Applikation erstellt und kann die aufrufen.
Ich kann die Buttons auch benutzen.
Mein Problem ist es jedoch, dass ich einen string über einen Com port zu senden.
Pyserial hab ich bereits installiert und mein Programm kann ich auch starten.
Aber sobald ich was senden möchte endet das Programm mit einem Fehler.
Ich hoffe ihr könnt mir da helfen, was ich übersehen habe.
import serial
import sys
from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi("sign.ui", self)
#slots einrichten
self.ui.sedbut.clicked.connect(self.senden_but)
self.ui.pushButton_3.clicked.connect(self.open_but)
self.ui.pushButton_2.clicked.connect(self.close_but)
#self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
#self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
#self.ui.comboBox.activated[str].connect(self.activ_com)
#self.ui.comboBox_2.activated[str].connect(self.activ_baud)
#aufgaben der einzelnen buttons
def senden_but(self):
ser.write('1234')
#except ValueError:
# show_Dialog()
pass
def open_but(self):
#serial port defination
ser = serial.Serial(
baudrate = 1200,
port = 'COM1',
timeout = None)
try:
ser.isOpen()
self.pushButton_3.setStyleSheet("background-color: green")
self.pushButton_3.setText('close')
except ValueError:
show_Dialog()
pass
def show_Dialog(self):
msg = QMessageBox ()
msg.setIcon(QMessageBox.Critical)
msg.setText("senden nicht möglich")
msg.setStandardButtons(QMessageBox.Ok)
pass
def close_but(self):
self.destroy()
pass
app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())
senden über Com port RS 232
Bitte die Code-Tags benutzen, um deinen Code zu setzen. Das ist der </>-Knopf im erweiterten Editor. Denn so kann man dein Programm nicht entziffern, weil die Einrueckungen kaputt gegangen sind.
Und wenn du einen Fehler bekommst, dann zeig bitte auch den.
Und wenn du einen Fehler bekommst, dann zeig bitte auch den.
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Micha_1909: Ich würde empfehlen vor der GUI-Programmierung erst einmal Objektorientierung ohne GUI zu lernen, denn das braucht man für GUIs. Sonst muss man objektorientierte Programmierung und GUI-Programmierung zusammen lernen.
Die ``pass``-Anweisungen machen alle keinen Sinn. Falls Dein Editor oder Deine IDE die automatisch einfügt, solltest Du das dem Programm abgewöhnen.
Entweder man bindet den Rückgaberwert von `loadUi()` an ein Attribut oder man übergibst der Funktion `self`. Beides macht keinen Sinn, denn dann hat man zwei Wege um an die selben Attribute zu gelangen. Da die Klasse von `QDialog` erbt, sollte man das `ui`-Attribut weg lassen und `self` übergeben.
Vewende vernünftige, beschreibende, nicht abekürzte, und nicht nummerierte Namen. Wenn `sedbut` eigentlich `send_button` heissen soll, dann nenn das auch so.
Die Methoden sollten dagegen dann nicht wie Buttons heissen. `send_button` ist ein guter Name für einen Button, aber keiner für eine Methode. Methoden und Funktionen werden üblicherweise nach der Tätigkeit benannt, die sie ausführen. Und da wird ja kein Button gesendet, sondern irgendwelche Daten.
``ser.isOpen()`` als Ausdruck ohne irgendetwas zusätzliches macht keinen Sinn. Zudem verwendet man die alten, nicht der Konvention entsprechenden Schreibweisen nicht mehr. Es gibt eine `is_open()`-Methode auf `Serial`-Objekten. Aber der Aufruf macht grundsätzlich hier keinen Sinn, denn der ergibt immer `True`. Die Erstellung hätte eine Ausnahme ausgelöst wenn das öffnen nicht geklappt hätte.
Ich sehe nicht wo da im ``try``-Block ein `ValueError` auftreten sollte.
`QMessageBox` wird nirgends definiert.
Die ``pass``-Anweisungen machen alle keinen Sinn. Falls Dein Editor oder Deine IDE die automatisch einfügt, solltest Du das dem Programm abgewöhnen.
Entweder man bindet den Rückgaberwert von `loadUi()` an ein Attribut oder man übergibst der Funktion `self`. Beides macht keinen Sinn, denn dann hat man zwei Wege um an die selben Attribute zu gelangen. Da die Klasse von `QDialog` erbt, sollte man das `ui`-Attribut weg lassen und `self` übergeben.
Vewende vernünftige, beschreibende, nicht abekürzte, und nicht nummerierte Namen. Wenn `sedbut` eigentlich `send_button` heissen soll, dann nenn das auch so.
Die Methoden sollten dagegen dann nicht wie Buttons heissen. `send_button` ist ein guter Name für einen Button, aber keiner für eine Methode. Methoden und Funktionen werden üblicherweise nach der Tätigkeit benannt, die sie ausführen. Und da wird ja kein Button gesendet, sondern irgendwelche Daten.
``ser.isOpen()`` als Ausdruck ohne irgendetwas zusätzliches macht keinen Sinn. Zudem verwendet man die alten, nicht der Konvention entsprechenden Schreibweisen nicht mehr. Es gibt eine `is_open()`-Methode auf `Serial`-Objekten. Aber der Aufruf macht grundsätzlich hier keinen Sinn, denn der ergibt immer `True`. Die Erstellung hätte eine Ausnahme ausgelöst wenn das öffnen nicht geklappt hätte.
Ich sehe nicht wo da im ``try``-Block ein `ValueError` auftreten sollte.
`QMessageBox` wird nirgends definiert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
@_blackjack_
vielen Dank für deine Vorschläge die werde ich gleich mal verbessern. Hast du vielleicht noch ein kleines Beispiel für mich wie ich dann über den Com was senden kann, bzw. definiert wird.
Das wäre super.
vielen Dank für deine Vorschläge die werde ich gleich mal verbessern. Hast du vielleicht noch ein kleines Beispiel für mich wie ich dann über den Com was senden kann, bzw. definiert wird.
Das wäre super.
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
@_deets_
Vielen Dank für den Tipp beim nächsten mal werde ich die Buttons verwenden.
Vielen Dank für den Tipp beim nächsten mal werde ich die Buttons verwenden.
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
@_deets_
ich hoffe, dass es geklappt hat.
Code: Alles auswählen
import serial
import sys
from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi("sign.ui", self)
#slots einrichten
self.ui.sedbut.clicked.connect(self.senden_but)
self.ui.pushButton_3.clicked.connect(self.open_but)
self.ui.pushButton_2.clicked.connect(self.close_but)
#self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
#self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
#self.ui.comboBox.activated[str].connect(self.activ_com)
#self.ui.comboBox_2.activated[str].connect(self.activ_baud)
#aufgaben der einzelnen buttons
def senden_but(self):
ser.write('1234')
#except ValueError:
# show_Dialog()
pass
def open_but(self):
#serial port defination
ser = serial.Serial(
baudrate = 1200,
port = 'COM1',
timeout = None)
try:
ser.isOpen()
self.pushButton_3.setStyleSheet("background-color: green")
self.pushButton_3.setText('close')
except ValueError:
show_Dialog()
pass
def show_Dialog(self):
msg = QMessageBox ()
msg.setIcon(QMessageBox.Critical)
msg.setText("senden nicht möglich")
msg.setStandardButtons(QMessageBox.Ok)
pass
def close_but(self):
self.destroy()
pass
app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())
Ja, schon besser. Wobei du nicht den Fehler zeigst. Aber den kann ich auch so erkennen. Wenn du die serielle Schnittestelle woanders benutzen willst, als nur im Konstruktor (__init__), dann musst du die an die Instanz binden, so wie du das auch mit allen moeglichen anderen Dingen wie pushButtons etc. machst. Also
Das ist wirklich absolute Python Objektorientierte-Programmierungs-Grundlage, es empfiehlt sich wenigstens mal ein paar Tutorials durchzuarbeiten, damit dir sowas kein Bein stellt.
Code: Alles auswählen
...
self.ser = ...
...
self.ser.write(...)
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
@_deets_
Vielen Dank für deine Hilfe.
Ja das werde ich machen oder ein Buch durcharbeiten.
Vielen Dank für deine Hilfe.
Ja das werde ich machen oder ein Buch durcharbeiten.
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
Hi
@ _deets_ vielen Dank für deinen Code den du mir als Vorschlag gesendet hast , aber leider kann ich immer noch nichts senden. Als ob da noch was fehlt.
Testweise am Terminal kommt leider nix an.
Vielleicht hat noch jemand ne Idee in welcher Richtung ich noch suchen kann.
@ _deets_ vielen Dank für deinen Code den du mir als Vorschlag gesendet hast , aber leider kann ich immer noch nichts senden. Als ob da noch was fehlt.
Testweise am Terminal kommt leider nix an.
Vielleicht hat noch jemand ne Idee in welcher Richtung ich noch suchen kann.
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
Code: Alles auswählen
import serial
import sys
from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi("sign.ui", self)
#slots einrichten
self.ui.sedbut.clicked.connect(self.senden_but)
self.ui.pushButton_3.clicked.connect(self.open_but)
self.ui.pushButton_2.clicked.connect(self.close_but)
#self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
#self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
#self.ui.comboBox.activated[str].connect(self.activ_com)
#self.ui.comboBox_2.activated[str].connect(self.activ_baud)
def open_but (self):
self.port = serial.Serial(
port='COM1',
baudrate = 9600,
timeout = 5)
self.pushButton_3.setStyleSheet("background-color: green")
self.pushButton_3.setText('close')
def senden_but (self):
self.port.write('1234')
def close_but(self):
self.destroy()
app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())
oben der geänderte Code.
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
Leider finde ich dazu nix, was mir helfen könnte.
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Micha_1909: Starte das mal in einem Terminal. Da sollte dann die Ausnahme samt Traceback ausgegeben werden wenn Du auf den Senden-Button klickst. Da ist neben dem was __deets__ anmerkt nämlich noch ein Fehler drin.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
@_blackjack_
@_deets_
ihr habt recht da ist noch ein AttributeError: ' MeinDialog' object has no attribute 'ser'
line 32 senden_but
self.ser.write('1234\r\n')
@_deets_
ihr habt recht da ist noch ein AttributeError: ' MeinDialog' object has no attribute 'ser'
line 32 senden_but
self.ser.write('1234\r\n')
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Micha_1909: Ähm im letzten Code gab es kein `self.ser` da hiess das `self.port`. Aber nein das ist auch nicht der Fehler. Und falls Du keinen Fehler bekommst hast Du trotzdem einen, denn dann verwendest Du noch Python 2, was ein Fehler ist. 
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
@_blackjack_
@_deets_
ja ich habe noch ein wenig probiert, ob ich den Fehler finde
und habe aus port -> ser gemacht.
@_deets_
ja ich habe noch ein wenig probiert, ob ich den Fehler finde
und habe aus port -> ser gemacht.
Code: Alles auswählen
import serial
import sys
from PyQt5 import QtWidgets, uic
class MeinDialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = uic.loadUi("sign.ui", self)
#slots einrichten
self.ui.sedbut.clicked.connect(self.senden)
self.ui.pushButton_3.clicked.connect(self.open)
self.ui.pushButton_2.clicked.connect(self.close)
#self.ui.comboBox.currentIndexChanged.connect(self.activ_com)
#self.ui.comboBox_2.currentIndexChanged.connect(self.activ_baud)
#self.ui.comboBox.activated[str].connect(self.activ_com)
#self.ui.comboBox_2.activated[str].connect(self.activ_baud)
def open (self):
self.ser = serial.Serial(
port='COM1',
baudrate = 9600,
timeout = 5)
self.pushButton_3.setStyleSheet("background-color: green")
self.pushButton_3.setText('close')
def senden (self):
self.ser.write('1234\r\n')
def close(self):
self.destroy()
app = QtWidgets.QApplication(sys.argv)
dialog = MeinDialog()
dialog.show()
sys.exit(app.exec_())
-
- User
- Beiträge: 14
- Registriert: Mittwoch 29. April 2020, 14:38
so sieht der Code jetzt aus