문제

지정된 서버에 이미지를 업로드하는 데 사용되는 앱을 만들고 있습니다. 나는 QT 디자이너에서 내 GUI를 만들었습니다. 모든 것이 잘 작동합니다. 단순히 내가 아는 무언가에 갇혀 있습니다. 내 머리를 감싸는 것 같다.

아이디어는 스크립트가 통과하여 이미지 경로와 함께 몇 개의 텍스트 필드가 제출되는지 확인해야합니다. 각 경로를 가져 와서 각 경로를 서버에 업로드합니다. 나는 단지 하나의 상자만으로 작동하게 만들 수 있지만이 프로세스에 대한 루프를 만들려고 할 때 분리됩니다. 기본적으로 각 경로마다 '풀 이름'을 반환해야합니다. 이것은 단지 스 니트이지만 아이디어를 얻는다 ..

이 개념은 충분히 단순 해 보이며 여러 가지 방법으로 이것을 다시 작성했으며 찾아서 생각할 수있었습니다. 모든 도움은 굉장 할 것입니다. 대신 목록을 사용해야합니까?

        # 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)
도움이 되었습니까?

해결책

당신이 가진 문제는 당신이 변수에 할당한다는 것입니다. fullname 매번 3 회 덮어 쓰기. 따라서 For Loop에 도달 할 때까지 마지막 필드가 설정된 경우 마지막 파일 이름 만 사용할 수 있습니다. 하나의 변수가 아닌 전체 이름 목록이 필요하다는 진술이 정확합니다. 아래와 같은 것이 필요합니다.

    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)

다른 팁

#3에 도달하기 위해 +1이어야하는 범위의 문제 (Vincent R의 CF 비고),

(중 하나) 문제는 FullName 변수가 비 빈 레이블의 각각의 새로운 사례와 함께 덮어 쓰여진다는 것입니다.

코드를 고치는 것은 코드에 대해 언급하기가 어렵습니다. 즉, 그것을 제안하고 조금 재구성하고 싶습니다. 예를 들어 UI 객체가 주어진 주어진 이미지의 이름 / 경로를 추출하는 함수를 도입함으로써; 이것은 반복의 일부를 피할 것입니다. 그러한 함수 또는 그것의 발신자는 각각의 새로운 풀 이름을 그 목록에 추가 한 다음 업로드 루프에서 사용할 수 있습니다.

원래 구조를 존중하지만 제안 된대로 목록을 소개하는 Tendayi Mawushe의 솔루션을 참조하십시오. BTW이 목록은 범위 () 함수에 의존하는 대신 루프의 기초로 반복 할 수 있습니다. 이것은 훨씬 더 피스닉입니다 (이로 인해 범위에서 #3이 누락 된 문제를 해결할 필요가 없습니다). 때때로 파이썬으로도 편리하지만 이러한 숫자 범위 구동 루프는 종종 디자인을 다시 방문하는 초대입니다.

원래 코드의 또 다른 문제는 레이블 1과 3이 비어 있지 않지만 레이블 2는 totalImages 두 개의 경로 만 있더라도 3으로 설정됩니다.

또한이 코드의 오타 ( "2"vs "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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top