سؤال

وفي برنامج بيثون بلدي لتحميل الملف إلى الإنترنت، والتراسل الفوري باستخدام شريط التقدم GTK لإظهار التقدم تحميل. ولكن المشاكل التي تواجه ايم هو أن شريط التقدم لا تظهر أي نشاط حتى اكتمال التحميل، ومن ثم فإنه يدل فجأة تحميل كاملة. التراسل الفوري باستخدام pycurl لجعل طلبات HTTP ... سؤالي هو: - هل أنا بحاجة إلى متعددة الخيوط تطبيق لتحميل ملف في وقت واحد تحديث واجهة المستخدم الرسومية؟ أم أن هناك بعض الخطأ الآخر أن ايم صنع؟

ويرجع الفضل في ذلك مسبقا!

هل كانت مفيدة؟

المحلول

وانا ذاهب الى أقتبس من جتك التعليمات :

<اقتباس فقرة>   

ولقد قمت بإنشاء شريط التقدم داخل النافذة، ثم البدء في تشغيل حلقة التي تقوم ببعض العمل:

while work_left:
    ...do something...
    progressbar.set_fraction(...)
<اقتباس فقرة>   

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

     

وأبسط حل يتكون على السيطرة إعطاء مؤقتا إلى جتك كل مرة يتم فيها تغيير التقدم:

while work_left:
    ...do something...
    progressbar.set_fraction(...)
    while gtk.events_pending():
        gtk.main_iteration()
<اقتباس فقرة>   

لاحظ أن هذا الحل، لا يمكن للمستخدم إنهاء التطبيق (أن gtk.main_quit لا تعمل بسبب حلقة جديدة [gtk.main_iteration ()]) حتى يتم heavy_work الخاص بك.

     

وحل آخر يتكون على استخدام وظائف الخمول جتك، والتي تسمى من قبل جتك حلقة رئيسية كلما كان لديها ما تفعله. ولذلك، جتك هو في السيطرة، وظيفة عاطلة أن تفعل شيئا من العمل. يجب أن إرجاع صحيح إذا كان هناك المزيد من العمل الذي يتعين القيام به، خطأ غير ذلك.

     

وأشير الحل الأفضل (أنه لا يوجد لديه عيوب) من قبل جيمس Henstridge. ومن خلال الاستفادة من مولدات الثعبان في وظائف الخمول، لجعل الثعبان تلقائيا الحفاظ على الدولة بالنسبة لنا. وغني عن مثل هذا:

def my_task(data):
    ...some work...
    while heavy_work_needed:
        ...do heavy work here...
        progress_label.set_text(data) # here we update parts of UI
        # there's more work, return True
        yield True
    # no more work, return False
    yield False

def on_start_my_task_button_click(data):
    task = my_task(data)
    gobject.idle_add(task.next)
<اقتباس فقرة>   

وو'في حين أن' سبق هو مجرد مثال على ذلك. قواعد الوحيدة هي أنه ينبغي أن تسفر صحيح بعد القيام قليلا من العمل وهناك المزيد من العمل للقيام به، ويجب أن تسفر الكاذبة عندما تتم المهمة.

نصائح أخرى

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

والسبب تحتاج إلى تحديث يدويا العرض هو لموضوع الرئيسي الخاص بك هو المنفذ أيضا التحميل، وهو حيث انها تسد.

في بيثون المعاملات الإصدار 2.x صحيح يؤدي إلى قسمة عدد صحيح. جرب هذا:

#Callback function invoked when download/upload has progress
def progress(download_t, download_d, upload_t, upload_d):
    print 'in fileupload progress'
    mainwin.mainw.prog_bar.set_fraction(float(upload_d) / upload_t)

وخيار واحد، إذا لم تكن متزوجة من pycurl، هو استخدام مراقبي IO GObject ل.

http://pygtk.org/ pygtk2reference / gobject-functions.html # الوظائف gobject - الإعلام والتوعية الوظيفة الإضافية مشاهدة

وباستخدام هذا يمكنك تعشيق تحميل الملف مع طبيعية جتك حلقة الحدث، وحتى قيام الدعوة set_progress في حياتك IO ساعة الاستدعاء. إذا كنت تفريغ كل عمل من أجل تحميلها pycurl لم يكن ذلك ممكنا حقا، ولكن إذا كنت مجرد تحميل ملف عبر HTTP، io_add_watch سوف تجعل من استخدام مأخذ لهذا بكثير أقل إيلاما كذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top