Застрял на петле! - PullRequest
       23

Застрял на петле!

0 голосов
/ 17 ноября 2009

Я создаю приложение, которое будет использоваться для загрузки изображений на указанный сервер. Я создал свой графический интерфейс в Qt Designer, все отлично работает, я просто застрял на чем-то, что я знаю, просто. Не могу, кажется, обернуть мою голову вокруг этого.

Идея состоит в том, чтобы сценарий прошел и увидел, сколько текстовых полей заполнено путями изображений - оттуда получите каждый путь и по порядку загрузите каждое на сервер. Я могу заставить его работать только с одной коробкой, но когда я пытаюсь создать цикл для этого процесса, он разваливается. Мне в основном нужно возвращать 'полное имя' с каждым другим путем. Это просто отрывок, но вы поняли ...

Концепция кажется достаточно простой, и я переписал это так много способов, и я мог найти и подумать. Любая помощь будет потрясающей. Должен ли я использовать списки, чтобы сделать это вместо этого или что-то?

        # count how many images there are going to be
    if not self.imgOnePathLabel.text().isEmpty():
        totalImages = 1
        # gets the path from IMAGE 1 box
        image1 = self.imgOnePathLabel.text()
        fullname = '%s' % image1
    if not self.imgTwoPathLabel.text().isEmpty():
        totalImages = 2
        image2 = self.img2PathLabel.text()
        fullname = '%s' % image2
    if not self.imgThreePathLabel.text().isEmpty():
        totalImages = 3
        imageThreePath = self.imgThreePathLabel.text()
        fullname = '%s' % imageThreePath
    try:
        for x in range(1,totalImages,1):
            # split end file from the file path
            name = os.path.split(fullname)[1]
            f = open(fullname, "rb")
            # store our selected file
            ftp.storbinary('STOR ' + name, f)
            msg = "Sent <font color=green>" + name + "</font>"
            self.logBrowser.append(msg)
            f.close()

    finally:
        msg = "<font color=green>" "Ok" "</font>"
        self.logBrowser.append(msg)

Ответы [ 3 ]

2 голосов
/ 17 ноября 2009

Проблема в том, что вы присваиваете переменную fullname три раза, перезаписывая ее каждый раз. Таким образом, к тому времени, когда вы попадете в цикл for, будет доступно только последнее имя файла, если последнее поле было установлено, иначе вы вообще ничего не получите. Ваше утверждение о том, что вам нужен список полных имен, а не одной переменной, является правильным. Вам нужно что-то вроде ниже:

    fullnames = []
    imageLabels = [self.imgOnePathLabel, self.imgTwoPathLabel,
            self.imgThreePathLabel]
    for imageLabel in imageLabels:
        if imageLabel.text():
            image = self.imgOnePathLabel.text()
            fullnames.append('%s' % image)
    try:
        for fullname in fullnames:
            # split end file from the file path
            name = os.path.split(fullname)[1]
            f = open(fullname, "rb")
            # store our selected file
            ftp.storbinary('STOR ' + name, f)
            msg = "Sent <font color=green>" + name + "</font>"
            self.logBrowser.append(msg)
            f.close()
    finally:
        msg = "<font color=green>" "Ok" "</font>"
        self.logBrowser.append(msg)
0 голосов
/ 18 ноября 2009

Другая проблема с вашим исходным кодом заключается в том, что если метки 1 и 3 не пустые, а метка 2 - это, totalImages будет установлен в 3, даже если у вас есть только два пути.

Кроме того, опечатка в этом коде ("Два" против "2"):

if not self.imgTwoPathLabel.text().isEmpty():
    image2 = self.img2PathLabel.text()

И я считаю, что вам не нужно подстановку строк '%s' % image.

Вы можете немного сжать свой код (и исправить ваши проблемы), например:

# this is a list of references to your PyQt4 label objects
imagePathLabels = [self.imgOnePathLabel, 
                   self.imgTwoPathLabel, 
                   self.imgThreePathLabel]

try:
    for label in imagePathLabels:
        if not label.text().isEmpty():
            image_path = label.text()
            image_name = os.path.split(image_path)[1]
            f = open(image_path, "rb")
            ftp.storbinary('STOR ' + image_name, f)
            msg = "Sent <font color=green>" + name + "</font>"
            self.logBrowser.append(msg)
            f.close()
finally:
    msg = "<font color=green>" "Ok" "</font>"
    self.logBrowser.append(msg)
0 голосов
/ 17 ноября 2009

Помимо вопроса о диапазоне, который должен быть равен +1, чтобы достичь # 3 (см. Замечание Винсента Р),

(одна из проблем) заключается в том, что переменная полного имени перезаписывается каждым новым регистром непустой метки.

Трудно комментировать код, чтобы просто исправить его, то есть я хотел бы предложить и немного реорганизовать его. Например, путем введения функции для извлечения имени / пути данного изображения, заданного объекта пользовательского интерфейса; это позволит избежать некоторых повторений. Такая функция или ее вызывающая сторона будут затем добавлять каждое новое полное имя в свой список, который затем может использоваться в цикле загрузки.

См. Решение Tendayi Mawushe, которое уважает оригинальную структуру, но вводит список в соответствии с предложением. Кстати, этот список затем может быть повторен как основа цикла, вместо того, чтобы полагаться на функцию range (), и это намного более питонно (и это устраняет необходимость исправления проблемы с отсутствующим # 3 с ассортиментом). Будучи удобными в некоторых случаях, в Python эти циклы с числовым диапазоном часто являются приглашением для пересмотра дизайна.

...