0

指定したサーバーに画像をアップロードするために使用されるアプリを作成しています。Qt Designer で GUI を作成しました。すべて正常に動作します。単純だとわかっていることに固執しています。私の頭を包み込むようには見えません。

アイデアは、スクリプトが通過し、画像のパスが入力されたテキスト フィールドの数を確認することです。そこから各パスを取得し、それぞれをサーバーにアップロードします。1 つのボックスだけで問題なく機能させることができますが、このプロセスのループを作成しようとすると、バラバラになります。基本的に、それぞれ異なるパスで「フルネーム」を返す必要があります。これは単なる断片ですが、アイデアはわかります..

概念は十分に単純に思えます。私はこれをさまざまな方法で書き直し、見つけて考えることができました。どんな助けでも素晴らしいでしょう。代わりにこれを行うためにリストを使用する必要がありますか?

        # 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)
4

3 に答える 3

2

あなたが抱えている問題は、変数にfullname3回割り当てて、毎回上書きしていることです。したがって、 for ループに到達するまでに、最後のフィールドが設定されている場合は最後のファイル名のみが使用可能になり、それ以外の場合は何も取得されません。1 つの変数ではなく、完全な名前のリストが必要であるというあなたのステートメントは正しいです。以下のようなものが必要です。

    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)
于 2009-11-17T20:14:45.827 に答える
0

#3 に到達するには範囲を +1 にする必要があるという問題は別として (Vincent R のコメントを参照)、

(の 1 つ) 問題は、fullname 変数が空でないラベルの新しいケースのそれぞれで上書きされることです。

コードを修正するためだけにコメントするのは難しいです。つまり、少し提案して再編成したいと思います。たとえば、UI オブジェクトを指定して、特定の画像の名前/パスを抽出する関数を導入することによって。これにより、繰り返しの一部が回避されます。そのような関数、またはその呼び出し元は、新しいフルネームをそれぞれのリストに追加し、アップロード ループで使用できるようにします。

Tendayi Mawushe のソリューションを参照してください。これは、元の構造を尊重していますが、提案されているリストを紹介しています。ところで、このリストは、range() 関数に依存する代わりに、ループの基礎として繰り返すことができます。これは、はるかに Pythonic です(これにより、範囲で #3 が欠落しているという問題を修正する必要がなくなります)。場合によっては便利ですが、Python では、これらの数値範囲駆動型ループは、多くの場合、設計を再検討するための招待状になります。

于 2009-11-17T20:14:29.197 に答える
0

元のコードのもう 1 つの問題は、ラベル 1 と 3 が空白ではなく、ラベル 2 が空白の場合、totalImagesパスが 2 つしかない場合でも、3 に設定されることです。

また、このコードのタイプミス (「2」対「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)
于 2009-11-17T21:01:57.620 に答える