English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

كود لإنشاء شريط التقدم في الشاشة التكميلية

أكبر مشكلة في شريط التقدم هو أن جميع الأحرف تتكون في نفس السطر، وهي قابلة للتعديل.

عندما تنفذ جملة print، يقوم بايثون بإضافة '\n' إلى نهاية النص، وهو ما يعني الارتجاع إلى السطر الجديد، مما يؤدي إلى عدم القدرة على تعديل النص في تحت الشاشة بعد الطباعة. لذا، لا يمكننا استخدام print لإنجاز الإخراج الآن.

نحن نستخدم هو من مكتبة sys و الدالة sys.stdout.write()، التي ستقوم بطباعة هذا النص في الشاشة دون إضافة أي نهاية، مما يعني أن هذا الإخراج لم ينته بعد. يمكن استخدام دالة sys.stdout.flush() لطباعة الإخراج مؤقتًا في الشاشة (لإيجاد تأثير print، نسمي هذا الإخراج الزائف). إذا استخدمنا رمز التحويل 'r' (العودة إلى بداية السطر)، هل يبدو كل شيء أكثر منطقية؟

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

مثال

[تم اختبار هذا فقط في terminal Linux، لا يعمل في pycharm أثناء الت调试]

import sys, time
for i in range(5):
 sys.stdout.write('HELLO: %05d' % i)
 sys.stdout.flush()
 time.sleep(1)

عند تنفيذ هذا الكود في الشاشة الت终端، نحصل على تأثير شريط التقدم البسيط.

بعد ذلك، يجب حل مشكلتين:

أولاً: إفراغ الحافظة

قد يلاحظ بعض القراء أن هناك مشكلة عندما يكون النص الجديد أقصر من النص السابق، مثل هذا الكود التالي:

import sys, time
for i in range(5):
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

بعد التنفيذ، وجدنا أن النتيجة ليست كما نأمل.

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

import sys, time
for i in range(5):
sys.stdout.write(' ' * 10 + '\r')
sys.stdout.flush()
sys.stdout.write(str(i) * (5 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

ثانيًا: إخراج أسفل ثابت

في بعض الأحيان نريد أن يكون هناك输出来جازمة في نفس وقت تحميل شريط التقدم.

لنفرض أننا نريد إخراج النص المطلوب بعد تجديد النص السابق، ثم نكتب شريط التقدم الافتراضي.

نستخدم الآتي ككود:

import sys, time
for i in range(5):
 sys.stdout.write(' ' * 10 + '\r')
 sys.stdout.flush()
 print i
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

يمكنك إكمال المهمة المطلوبة.

كيف، في الواقع فإن المبدأ بسيط جدًا، أليس كذلك؟

هنا يقدم لك فئة تم تطويرها بنفسك لطباعة شريط التقدم:

import sys, time
class ProgressBar:
 def __init__(self, count = 0, total = 0, width = 50):
  self.count = count
  self.total = total
  self.width = width
 def move(self):
  self.count += 1
 def log(self, s):
  sys.stdout.write(' ' * (self.width + 9) + '\r')
  sys.stdout.flush()
  print s
  progress = self.width * self.count / self.total
  sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total))
  sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r')
  if progress == self.width:
   sys.stdout.write('\n')
  sys.stdout.flush()
bar = ProgressBar(total = 10)
for i in range(10):
 bar.move()
 bar.log('We have arrived at: ' + str(i + 1))
 time.sleep(1)

النتيجة كالتالي:

بهذا يمكن مراقبة تقدم التطبيق بسهولة في بعض المهام، مثل البرمجيات المسحوبة، التعلم الآلي، والعمل الذي لا يعرف كم من الوقت سيستغرقه، ويمكن أن يكون لديك أيضًا تحكم في الوقت بشكل مرئي.

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

بيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية حقوق النشر للمالك الأصلي، تم جمع المحتوى من قبل المستخدمين على الإنترنت بشكل متعاوني وتحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل أي مسؤولية قانونية. إذا وجدت محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # ب @ عند إرسال البريد الإلكتروني) لإبلاغنا، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فوراً.

سيكون لديك رغبة في