استخدام المواضيع لإلغاء تجميد حلقة الحدث الرئيسية
في كثير من الأحيان، سوف "تتجمد" عناصر واجهة المستخدم الرسومية، مثل أشرطة التقدم، أثناء تنفيذ العمليات المكثفة في الموضوع الرئيسي. يحدث هذا بسبب حظر حلقة الحدث الرئيسية، التي تتعامل مع تفاعلات المستخدم وتحديثات واجهة المستخدم الرسومية. لمنع ذلك، يمكن استخدام تعدد مؤشرات الترابط لتشغيل المهام طويلة الأمد في سلسلة منفصلة.
في السيناريو المحدد المحدد، يجب أن تؤدي النقرة على الزر إلى بدء رسم متحرك لشريط التقدم لمدة خمس ثوانٍ. ومع ذلك، السلوك الملاحظة هو تجميد الزر أثناء هذه المدة. يمكن حل هذه المشكلة عن طريق استخدام سلاسل الرسائل، ولكن ربط الخيط في الخيط الرئيسي يؤدي إلى الانتظار حتى الانتهاء، مما يؤدي إلى حظر واجهة المستخدم الرسومية بشكل فعال.
النهج البديل: فصل المنطق إلى فئات
بدلاً من التعامل مع كل شيء ضمن فئة واجهة المستخدم الرسومية واحدة، من الممكن وضع الجزء المنطقي في فئة مختلفة وإنشاء مثيل لواجهة المستخدم الرسومية من تلك الفئة. ومع ذلك، يتطلب هذا طريقة لاستدعاء أسلوب فئة المنطق من فئة واجهة المستخدم الرسومية.
الحل باستخدام الترابط
لمعالجة هذه المشكلة، استخدم كائن قائمة الانتظار للتواصل بين يمكن اعتبار فئة واجهة المستخدم الرسومية وفئة المنطق. توضح الخطوات التالية هذا الأسلوب:
تنفيذ التعليمات البرمجية
يوجد أدناه مثال على التنفيذ باستخدام مهمة مترابطة للتعامل مع الرسوم المتحركة لشريط التقدم:قائمة انتظار الاستيراد واجهة المستخدم الرسومية فئة: # رمز إعداد واجهة المستخدم الرسومية يظهر هنا بالتأكيد tb_click(النفس): التقدم الذاتي () self.prog_bar.start() قائمة الانتظار الذاتية = قائمة الانتظار. قائمة الانتظار () ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) تعريف عملية قائمة الانتظار (النفس): يحاول: رسالة = self.queue.get_nowwait() # عرض نتيجة المهمة إذا لزم الأمر self.prog_bar.stop() باستثناء قائمة الانتظار. فارغة: self.master.after(100, self.process_queue) فئة ThreadedTask(threading.Thread): تعريف __init__(الذات، قائمة الانتظار): سوبر ().__init__() self.queue = queue تشغيل ديف (النفس): time.sleep(5) # محاكاة عملية طويلة الأمد self.queue.put("تم الانتهاء من المهمة")import queue class GUI: # Code for GUI setup goes here def tb_click(self): self.progress() self.prog_bar.start() self.queue = queue.Queue() ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) def process_queue(self): try: msg = self.queue.get_nowait() # Show result of the task if needed self.prog_bar.stop() except queue.Empty: self.master.after(100, self.process_queue) class ThreadedTask(threading.Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): time.sleep(5) # Simulate long running process self.queue.put("Task finished")يعمل هذا الأسلوب بشكل فعال على إبقاء الخيط الرئيسي قيد التشغيل والاستجابة أثناء تنفيذ المهمة طويلة الأمد في خيط منفصل.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3