2017-08-07 5 views
-1

Ich bin relativ neu in Python und PyQt5, es tut mir leid, wenn diese Frage ziemlich einfach ist. Ich möchte eine kritische Nachricht erstellen, die besagt, dass ein bestimmter QlineEdit leer ist und das Programm nicht ausgeführt wird. Ich konnte die Nachricht an die entsprechende Eingabe binden, aber wenn ich auf die Abbrechen-Schaltfläche oder das "X" klicke, wird die Nachricht immer wieder angezeigt. Ich möchte, dass es geschlossen wird, nachdem Sie geklickt haben. Was mache ich falsch? PS: Ich benutze PyQt5.QMessageBox schließt nicht

def startTest(self): 
    if len(self.Radius_in.text()) == 0: 
     QMessageBox.critical(self, "Error", "Please enter the radius", QMessageBox.Cancel) 
     pass 
    elif len(self.Distance_in.text()) == 0: 
     QMessageBox.critical(self, "Error", "Please enter the distance",QMessageBox.Cancel) 
     pass 
    elif len(self.Speed_in.text()) == 0: 
     QMessageBox.critical(self, "Error", "Please enter the linear speed",QMessageBox.Cancel) 
     pass 
    elif len(self.Nload_in.text()) == 0: 
     QMessageBox.critical(self, "Error", "Please enter the normal load",QMessageBox.Cancel) 
     pass 
    elif len(self.Acq_int_in.text()) == 0: 
     QMessageBox.critical(self, "Error", "Please enter the acquisition rate",QMessageBox.Cancel) 
     pass 
    elif len(self.file_name.text()) == 0: 
     QMessageBox.critical(self, "Error", "Please enter the name of the file",QMessageBox.Cancel) 
     pass  
    else: 
     #open and save a file 
     fileName = self.file_name.text() 
     savedFile = open(fileName + ".txt","w") 

     runTime = round(float(str(self.Distance_in.text()))/(60.*float(str(self.Speed_in.text()))),2) 
     NoLaps = round(float(str(self.Distance_in.text()))/(pi*2.*float(str(self.Radius_in.text()))),2) 
     discRot = round(float(str(self.Speed_in.text()))*60./(2.*pi*float(str(self.Radius_in.text()))),2) 
     discFreq = round(float(str(self.Speed_in.text()))/(2.*pi*float(str(self.Radius_in.text()))),2)     
     try: 
      self.duration_out.setText(str(runTime)) 
      self.laps_out.setText(str(NoLaps)) 
      self.rotation_out.setText(str(discRot)) 
      self.Freq_out.setText(str(discFreq)) 
     except: 
      self.duration_out.setText('error') 
      self.laps_out.setText('error') 
      self.rotation_out.setText('error') 
      self.Freq_out.setText('error')   
+0

Was tun Sie genau von „Ich war in der Lage, die Nachricht an den entsprechenden Eingang zu binden“? Wie wird 'startTest' aufgerufen? – ekhumoro

+1

Vielleicht möchten Sie alle diese Nachrichtenfelder neu überdenken, weil dies zu einer * wirklich schrecklichen * Benutzererfahrung führt. Ein viel besserer Weg, dies zu tun, besteht darin, die Schaltfläche, die die Berechnung durchführt, zunächst zu deaktivieren und erst dann zu aktivieren, wenn alle erforderlichen Felder einen gültigen Wert haben. Es wäre auch angenehmer für den Benutzer, die numerischen Werte über Spin-Boxen einzugeben (was wiederum vermeiden würde, all diese hässlichen String-Konvertierungen durchzuführen). – ekhumoro

+0

ekhumoro StartTest wird aufgerufen, als eine Taste gedrückt wurde, und "Ja" Ich schrieb einige Zeilen, um die Schaltfläche zu blockieren, wenn alle Eingänge nicht eingegeben werden und es funktioniert. Wenn der Benutzer jedoch eine der Eingaben löscht, wird die Schaltfläche nicht wieder deaktiviert. Aus diesem Grund habe ich die QMessageBoxes erstellt. Der Code, den ich für sie geschrieben hat, ist wie folgt: 'self.start_btn.setEnabled (False) def enablebtn (Selbst-): wenn Len (self.Radius_in.text()) == 0: Pass anderes: Selbst. start_btn.setEnabled (True) ' – Luca

Antwort

0
# Enable and disable the start button  
    self.start_btn.setEnabled(False) 
def enablebtn(self): 
    if (len(self.Radius_in.text()) != 0) and (len(self.Distance_in.text()) != 0) and (len(self.Speed_in.text()) != 0)\ 
     and (len(self.Nload_in.text()) != 0) and (len(self.Acq_int_in.text()) != 0) and (len(self.file_name.text()) != 0): 
      self.start_btn.setEnabled(True) 
    else: 
     self.start_btn.setEnabled(False)