문제
지정된 서버에 이미지를 업로드하는 데 사용되는 앱을 만들고 있습니다. 나는 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)