спиране на изпълнението на код по чист начин python

Имам GUI, създаден с помощта на PyQt. В GUI това е бутон, който при натискане изпраща някои данни на клиента. Следва моят код

class Main(QtGui.QTabWidget, Ui_TabWidget):
    def __init__(self):
        QtGui.QTabWidget.__init__(self)
        self.setupUi(self)
        self.pushButton_8.clicked.connect(self.updateActual)

    def updateActual():
        self.label_34.setText(self.comboBox_4.currentText())        
        HOST = '127.0.0.1'    # The remote host
        PORT = 8000              # The same port as used by the server
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            s.connect((displayBoard[str(self.comboBox_4.currentText())], PORT))
        except socket.error as e:
            err1 = str(self.comboBox_4.currentText()) + " is OFF-LINE"
            reply2 = QtGui.QMessageBox.critical(self, 'Error', err1, QtGui.QMessageBox.Ok)
            if reply2 == QtGui.QMessageBox.Ok:
                pass   #stop execution at this point
        fileName = str(self.comboBox_4.currentText()) + '.txt'
        f = open(fileName)
        readLines = f.readlines()
        line1 = int(readLines[0])
        f.close()

Понастоящем, ако потребител щракне върху „ok“ в QMessageBox, програмата ще продължи изпълнението на кода, в случай че техният сокет е изключение. По този начин въпросът ми е как мога да спра изпълнението на код след „освен“ по чист начин, така че потребителският ми интерфейс да не се срине и потребителят да може да продължи да го използва?


person prattom    schedule 09.01.2014    source източник
comment
Мога ли да напиша просто празен return 'return' вместо 'pass'   -  person prattom    schedule 09.01.2014


Отговори (1)


Да, можете просто да return от блока if:

if reply2 == QtGui.QMessageBox.Ok:
    return

Друга възможност е да преместите кода си, когато не raise socket.error в блок else:

try: # this might fail
    s.connect(...)
except socket.error as e: # what to do if it fails
    err1 = ...
    reply2 = QtGui.QMessageBox.critical(...)
else: # what to do if it doesn't
    with open(fileName) as f:
        line1 = int(f.readline().strip())

Забележи, че:

  1. Всъщност не е нужно да се справяте с връщането от кутията за съобщения, тъй като може да е само ОК и нямате else опция;
  2. обикновено трябва да използвате with за обработка на файлове, той автоматично ще close в края на блока; и
  3. можете да опростите вашия код за обработка на файлове, като прочетете само първия ред.
person jonrsharpe    schedule 09.01.2014
comment
Благодаря, че ми каза за „със“. - person prattom; 09.01.2014