我正在创建一个应用程序,用于将图像上传到指定的服务器。我在Qt Designer中创建了我的GUI,一切正常我只是被困在我知道很简单的东西上。似乎无法绕过它。
这个想法是让脚本通过并查看有多少文本字段存入图像路径 - 从那里获取每个路径并按顺序将每个文件上传到服务器。我可以让它只用一个盒子就可以了,但是当我尝试为这个过程创建一个循环时它就崩溃了。我基本上需要返回每个不同路径的'fullname'。这只是一个嗤之以鼻,但你明白了......
这个概念看起来很简单,我已经用很多方式重写了这个,我可以找到并想到。任何帮助都是极好的。我应该使用列表来代替吗?
# 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)
答案 0 :(得分:2)
你遇到的问题是你每次都要为变量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)
答案 1 :(得分:0)
除了需要+1的范围以达到#3(参见Vincent R的备注)之外,
(其中一个)问题是fullname变量被每个非空标签的新案例覆盖。
很难对代码进行评论来解决它,即我想建议并重新整理一下。例如,通过引入一个函数来提取给定图像的名称/路径,给定UI对象;这样可以避免一些重复。这样的函数或它的调用者然后将每个新的全名添加到其列表中,然后可以由上载循环使用。
请参阅Tendayi Mawushe的解决方案,该解决方案尊重原始结构,但引入了建议列表。 BTW这个列表然后可以作为循环的基础迭代,而不是依赖于range()函数,而这更加pythonic (这消除了修复缺失问题的需要) #3范围)。虽然有时候使用Python,这些数值范围驱动的循环通常是重新访问设计的邀请。
答案 2 :(得分:0)
原始代码的另一个问题是,如果标签1和3不是空白,但标签2是,则即使您只有两条路径,totalImages
也会设置为3。
此外,此代码中的拼写错误(“Two”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)