سؤال

أقوم بإنشاء تطبيق سيتم استخدامه لتحميل الصور إلى خادم محدد.لقد قمت بإنشاء واجهة المستخدم الرسومية الخاصة بي في 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)
هل كانت مفيدة؟

المحلول

وقضية لديك هو أن كنت تعيين إلى fullname متغير ثلاث مرات الكتابة في كل مرة. حتى في الوقت الذي تحصل على لحلقة فقط يكون اسم الملف الأخير متاح إذا تم تعيين الحقل الأخير وإلا فإنك تحصل على شيء على الإطلاق. بيانكم التي تحتاجها قائمة الأسماء الكاملة المتغير بدلا من واحدة هو الصحيح. كنت بحاجة الى شيء مثل أدناه:

    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 للوصول إلى رقم 3 (راجع ملاحظة Vincent R)،

(إحدى) المشكلة (المشاكل) هي أنه تتم الكتابة فوق متغير الاسم الكامل بكل حالة جديدة من التسمية غير الفارغة.

من الصعب التعليق على الكود لإصلاحه فقط، على سبيل المثال.أود أن أقترح وأعيد تنظيمه قليلاً.على سبيل المثال، من خلال تقديم وظيفة لاستخراج اسم/مسار صورة معينة، بالنظر إلى كائن واجهة المستخدم؛وهذا من شأنه تجنب بعض التكرار.ستقوم هذه الوظيفة، أو المتصل بها، بإضافة كل اسم كامل جديد إلى قائمة منها، والتي يمكن استخدامها بعد ذلك بواسطة حلقة التحميل.

راجع حل Tendayi Mawushe، الذي يحترم البنية الأصلية ولكنه يقدم قائمة كما هو مقترح.راجع للشغل ثم يمكن تكرار هذه القائمة كأساس للحلقة، بدلا من الاعتماد على الدالة range()، و هذا أكثر بيثونية بكثير (وهذا يلغي الحاجة إلى حل مشكلة فقدان رقم 3 في النطاق).على الرغم من كونها مفيدة في بعض الأحيان، مع بايثون، فإن هذه الحلقات المدفوعة بالنطاق الرقمي غالبًا ما تكون دعوة لإعادة النظر في التصميم.

وثمة مسألة أخرى مع رمز الأصلي هو أنه إذا تسميات 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top