ich stehe mal wieder vor einem Problem. Ich erstelle ein GUI mit Qt.
Der Benutzer gibt im besten Fall positive Zahlen mit Punkt anstatt mit Komma ein. In allen anderen Fällen muss ich darauf reagieren und ich habe gerade Probleme damit Funktionen zu schreiben, die wirklich nur eine Sache mache.
Bevor ich in einer halben Seite erkläre, wie das Problem genau aussieht, wäre hier ein vereinfachtes Beispiel. Es sind in echt 8 Eingabefelder.
Klickt der Benutzer auf den "Calculate"-Button wird die Funktion `check_for_calculation`aufgerufen.
Der Name 'check_set_user_entry`sagt ja schon, dass die Funktion zwei Sachen macht, weil ich es für mich nicht sinnvoll aufteilen konnte. Wenn ich eine Funktion schreibe `check_user_entry`dann kann ich alle Eingaben abfragen und `True`oder `False`zurück geben und wenn das passt, kann ich eine Funktion `set_user_entry`schreiben, aber dann frage ich wieder alle Eingabefelder ab. Die Prüfung entfällt dann, aber ich frage zwei mal die gleichen Eingabefelder ab. Macht man das so? Oder wie macht man das?
Hier der (vereinfachte) Code wie ich ihn habe:
Code: Alles auswählen
def show_user_entry_error(self, value, entry):
pop_up = QMessageBox()
pop_up.setIcon(QMessageBox.Warning)
pop_up.setText(f"Check your entry for <{value}>. '{entry}' is not valid!")
pop_up.setWindowTitle("No valid user entry")
pop_up.setStandardButtons(QMessageBox.Ok)
pop_up.exec()
def convert_to_float(self, string, description):
try:
converted = float(string.replace(",", "."))
if converted <= 0:
self.show_user_entry_error(description, converted)
return False
except ValueError:
self.show_user_entry_error(description, string)
return False
return converted
def check_set_user_entry(self):
self.outer_diameter = self.convert_to_float(self.ui.outer_diameter.text(), "Outer diameter")
if not self.outer_diameter:
return False
def set_yield_strength(self):
if self.ui.unlock_settings.isChecked():
self.yield_strength = float(
self.material_properties[self.material][self.temperature]
)
return True
else:
self.yield_strength = self.convert_to_float(self.ui.yield_strength.text(), "Alternative Rp0,2")
return True
def check_for_calculation(self):
if not self.check_set_user_entry():
return
if not self.set_yield_strength():
return
self.thickness = calculate_something(
self.outer_diameter,
)
self.show_result()
Code: Alles auswählen
def show_user_entry_error(self, value, entry):
pop_up = QMessageBox()
pop_up.setIcon(QMessageBox.Warning)
pop_up.setText(f"Check your entry for <{value}>. '{entry}' is not valid!")
pop_up.setWindowTitle("No valid user entry")
pop_up.setStandardButtons(QMessageBox.Ok)
pop_up.exec()
def convert_to_float(self, string, description):
try:
converted = float(string.replace(",", "."))
if converted <= 0:
self.show_user_entry_error(description, converted)
return False
except ValueError:
self.show_user_entry_error(description, string)
return False
return converted
def check_user_entry(self):
if not self.convert_to_float(self.ui.outer_diameter.text(), "Outer diameter"):
return False
return True
def set_user_entry(self):
self.outer_diameter = float(self.ui.outer_diameter.text().replace(",", "."))
def check_for_calculation(self):
if not self.check_user_entry():
return
self.set_user_entry()
self.thickness = calculate_something(
self.outer_diameter,
)
self.show_result()
Vielen Dank!
Grüße
Dennis