Ich bin gerade dabei eine GUI mit PyQt5 zu schreiben. Verzeiht mir die Frage, aber bin im Bezug auf Programmieren noch ein Anfänger.
Aufgabenstellung:
Die GUI verlangt vom Benutzer mehrere Eingaben von "float" Zahlen. Diese können mit Komma oder Punkt getrennt sein, da ich vor der Übergabe die Komma`s noch in Punkte umwandle.
Für den Fall dass der Benutzer was ganz falsches eingibt hab ich QMessageBoxen eingerichtet.
Jetzt hab ich aber noch das Problem, dass mir bei einer solchen Falsch-Eingabe die QMessageBox zwar noch angezeigt wird, aber das Programm kurz darauf trotzdem abstürzt.
Ich weiß auch warum, aber ich weiß nicht wie ich das beheben kann.
Und zwar kommt nach den ganzen Abfragen eine übergabe in eine Funktion und diese findet auch statt wenn die Eingaben falsch waren.
Hatt jemand eine Idee wie ich das abfangen kann?
Ich schreibe hier mal den ganzen bisherigen Code, aber es geht im Grunde nur um den Schluss
Wie kann ich es abfangen, dass die folgende Zeile (hab Sie ganz unten markieret)
einzelne_zufallszahl(nachkomma, oT_replaced, uT_replaced)
erst ausgelöst wird wenn die Fehler des Benutzers richtig eingegeben wurden?
Vielen Dank im Voraus für die Hilfe.
Code: Alles auswählen
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QMainWindow, QPushButton, QLabel, QRadioButton, QVBoxLayout, QHBoxLayout, QLineEdit, QGridLayout, QListView, QMessageBox
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QIcon
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Definition des Hauptfenster's
self.setMinimumSize(QSize(700, 500))
self.setWindowTitle('Programm für Zufallszahlen')
self.setWindowIcon(QIcon('Icon.png'))
# Definition des Haupt Widget
main_wid = QtWidgets.QWidget(self)
self.setCentralWidget(main_wid)
vertikales_layout = QVBoxLayout() # vertikales Layout definieren
main_wid.setLayout(vertikales_layout) # das vertikale Layout als Hauptlayout definieren
# ------------------------
# Layout's definieren
# ------------------------
# Layout Zeile 1
layout_zeile_1 = QHBoxLayout()
layout_grid = QGridLayout() # Kommt in Zeile 1 rein
# Layout Zeile 2
layout_zeile_2 = QHBoxLayout() # Zeile 2: QLabel
layout_zeile_3 = QHBoxLayout() # Zeile 3: für Radio Buttons
layout_zeile_4 = QHBoxLayout() # Zeile 4: für Menge Zufallszahlen
layout_zeile_5 = QHBoxLayout() # Zeile 5: für Berechnen und Beenden Button
# ----------------------------------------------------------------------
# Layouts dem Hauptlayout hinzfügen, bzw. Unterlayouts hinzufügen:
# -----------------------------------------------------------------------
vertikales_layout.addStretch(1)
vertikales_layout.addLayout(layout_zeile_1) # Zum Hauptlayout ein Horizontales Layout in Zeile 1 hinzufügen
layout_zeile_1.addStretch(1) # Links neben dem Grid Layout ein Stretch hinzufügen damit das GridLayout mittig dargestellt wird egal wie groß das Fenster ist
layout_zeile_1.addLayout(layout_grid) # Zeile 1: Grid Layout
layout_zeile_1.addStretch(1) # Zeile 1: Stretch rechts neben Grid einfügen
vertikales_layout.addStretch(1) # zwischen Zeile 1 und 2 einen Stretch einfügen
vertikales_layout.addLayout(layout_zeile_2) # Zeile 2: QHBoxLayout (Qlabel) hinzufügen
vertikales_layout.addLayout(layout_zeile_3) # Zeile 3: für RadioButtons
vertikales_layout.addStretch(1) # Stretch Unter RadioButtons einfügen
vertikales_layout.addLayout(layout_zeile_4) # Zeile 4: für Menge Zufallszahlen
vertikales_layout.addStretch(1) # Stretch unter Menge Zufallszahlen einfügen
vertikales_layout.addLayout(layout_zeile_5) # Zeile 5: für berechnen und beenden Button
# -------------------------------------
# Widgets definieren
# -------------------------------------
# Widgets für Grid definieren
lbl1 = QLabel('Obere Toleranz der Zufallszahlen defninieren: ')
self.lineEdit1 = QLineEdit(self) # self.xxx ist dafür das es innerhalb der Funktion weiter benutzt werden kann
lbl2 = QLabel('Untere Toleranz der Zufallszahlen defninieren:')
self.lineEdit2 = QLineEdit(self)
# Widgets für Zeile 2 definieren
lbl4 = QLabel('Anzahl Nachkommastellen der zu erstellenden Zahlen: ')
# Widgets für Zeile 3 defninieren
self.radio_0 = QRadioButton('Null (0)')
self.radio_1 = QRadioButton('Eine (1)')
self.radio_2 = QRadioButton('Zwei (2)')
self.radio_3 = QRadioButton('Drei (3)')
self.radio_3.setChecked(1) # 3 Nachkommastellen sind im Standard Aktiviert
# Widgets für Zeile 4 definieren
lbl5 = QLabel('Menge der gewünschten Zufallszahlen:')
self.lineEdit5 = QLineEdit('50', self)
# Widgets für Zeile 5 definieren
button_berechnen = QPushButton('Berechnen')
button_berechnen.clicked.connect(self.berechnen)
button_beenden = QPushButton('Beenden')
button_beenden.clicked.connect(self.beenden)
# Widgets für Grid hinzufügen
layout_grid.addWidget(lbl1, 1, 1)
layout_grid.addWidget(self.lineEdit1, 1, 2)
layout_grid.addWidget(lbl2, 2, 1)
layout_grid.addWidget(self.lineEdit2, 2, 2)
# Widget in Zeile 2 hinzufügen:
layout_zeile_2.addStretch(1)
layout_zeile_2.addWidget(lbl4)
layout_zeile_2.addStretch(1)
# Widget in Zeile 3 hinzufügen:
layout_zeile_3.addStretch(1)
layout_zeile_3.addWidget(self.radio_0)
layout_zeile_3.addStretch(1)
layout_zeile_3.addWidget(self.radio_1)
layout_zeile_3.addStretch(1)
layout_zeile_3.addWidget(self.radio_2)
layout_zeile_3.addStretch(1)
layout_zeile_3.addWidget(self.radio_3)
layout_zeile_3.addStretch(1)
# Widgets in Zeile 4 hinzufügen
layout_zeile_4.addStretch(1)
layout_zeile_4.addWidget(lbl5)
layout_zeile_4.addWidget(self.lineEdit5)
layout_zeile_4.addStretch(1)
# Widgets in Zeile 5 hinzufügen
layout_zeile_5.addStretch(1)
layout_zeile_5.addWidget(button_berechnen)
layout_zeile_5.addWidget(button_beenden)
# Funktionen:
def berechnen(self):
"""Mit dem berechnen Button alle Felder auswerten"""
# Variable die es zu ausgeben / berechnen gilt:
oT = self.lineEdit1.text()
uT = self.lineEdit2.text()
menge = self.lineEdit5.text()
# Umwandlung des Feldes obere Toleranz in float
if oT == '':
QMessageBox.about(self, 'Hinweis zu Feld: \"Obere Toleranz\"',
'Das Feld für die\n\n \"Obere Toleranz\" \n\nist leer! \n\nBitte geben Sie hier das gewünschte obere Toleranzfeld an!')
elif oT != '':
try:
oT_replaced = float(oT.replace(',', '.'))
print(oT_replaced)
except:
QMessageBox.about(self, '!!! Fehler im Feld \"Obere Toleranz\" !!!',
'Die von Ihnen gemachte Eingabe im Feld \"Obere Toleranz\" war keine Zahl. Bitte geben Sie eine richtige Zahl ein!!')
else:
QMessageBox.about(self, '!! ÄUẞERST SELTSAMER FEHLER !!', 'Bitte geben Sie dem Administrator \"Herr Lippert\" bescheid!')
# Umwandlung des Feldes untere Toleranz in float
if uT == '':
QMessageBox.about(self, 'Hinweis zu Feld: \"Untere Toleranz\"',
'Das Feld für die \"Untere Toleranz\" ist leer! \n\nBitte geben Sie hier das gewünschte untere Toleranzfeld an!')
elif uT != '':
try:
uT_replaced = float(uT.replace(',', '.'))
print(uT_replaced)
except:
QMessageBox.about(self, '!!! Fehler im Feld \"Untere Toleranz\" !!!',
'Die von Ihnen gemachte Eingabe im Feld \"Untere Toleranz\" war keine Zahl. Bitte geben Sie eine richtige Zahl ein!!')
else:
QMessageBox.about(self, '!! ÄUẞERST SELTSAMER FEHLER !!', 'Bitte geben Sie dem Administrator \"Herr Lippert\" bescheid!')
# Ausgabe des Feldes "Menge der Zufallszahlen"
if menge == '':
QMessageBox.about(self, 'Hinweis zu \"Menge der Zufallszahlen\"',
'Das Feld für die Menge der Zufallszahlen ist leer!! \n\nBitte geben Sie hier die gewünschte Menge der zu erstellenden Zufallszahlen ein!')
elif menge != '':
try:
menge_replaced = int(menge)
print(menge)
except:
QMessageBox.about(self, '!!!Fehler im Feld \"Menge der Zufallszahlen\"!!!',
'Die von Ihnen gemachte Eingabe im Feld \"Menge der Zufallszahlen\" war keine ganze Zahl. Bitte geben Sie eine ganze Zahl (ohne Kommastelle) ein!')
else:
QMessageBox.about(self, '!! ÄUẞERST SELTSAMER FEHLER !!', 'Bitte geben Sie dem Administrator \"Herr Lippert\" bescheid!')
if self.radio_0.isChecked():
nachkomma = 0
print('Hallo ich bin 0')
print('Die Variable nachkomma hat folgende Zahl: ', nachkomma)
if self.radio_1.isChecked():
nachkomma = 1
print('Hallo ich bin 1')
print('Die Variable nachkomma hat folgende Zahl: ', nachkomma)
if self.radio_2.isChecked():
nachkomma = 2
print('Hallo ich bin 2')
print('Die Variable nachkomma hat folgende Zahl: ', nachkomma)
if self.radio_3.isChecked():
nachkomma = 3
print('Hallo ich bin 3')
print('Die Variable nachkomma hat folgende Zahl: ', nachkomma)
# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
einzelne_zufallszahl(nachkomma, oT_replaced, uT_replaced) # Folgende Zeile sollte erst ausgelöst werden wenn alles richtig ist.
# ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# Ende Button
@staticmethod
def beenden():
app.quit()
# -------------------------------------------------------------------------------------------------------------------------
# ------------------------ Funktionen ausserhalb Klasse -------------------------------------------------------------------
# -------------------------------------------------------------------------------------------------------------------------
def einzelne_zufallszahl(nachkomma_aus_gui, anfangswert_aus_gui, endwert_aus_gui):
nachkomma_funk = nachkomma_aus_gui
anfangswert_funk = anfangswert_aus_gui
endwert_funk = endwert_aus_gui
print('Anzahl Nachkommastellen: ', nachkomma_funk, 'Anfangswert: ', anfangswert_funk, 'Endwert: ', endwert_funk)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
haupt_fenster = MainWindow()
haupt_fenster.show()
sys.exit(app.exec_())