لديك حقا خياران. واحد يمكنك ترك وضع اللعنات ، وتنفيذ البرنامج ، ثم استئناف اللعنات. ثانياً ، يمكنك تنفيذ برنامجك بشكل غير متزامن ، وتحليل إخراجه واكتبه على الشاشة.
الأخبار السارة حول الخيار الأول هي أنك لا تحتاج فعليًا إلى كتابة أي طرق Fancy_State / Load_State لواجهة المستخدم. لعنات تفعل هذا من أجلك. إليك مثال بسيط لإظهار وجهة نظري
import curses, time, subprocess
class suspend_curses():
"""Context Manager to temporarily leave curses mode"""
def __enter__(self):
curses.endwin()
def __exit__(self, exc_type, exc_val, tb):
newscr = curses.initscr()
newscr.addstr('Newscreen is %s\n' % newscr)
newscr.refresh()
curses.doupdate()
def main(stdscr):
stdscr.addstr('Stdscreen is %s\n' % stdscr)
stdscr.refresh()
time.sleep(1)
with suspend_curses():
subprocess.call(['ls'])
time.sleep(1)
stdscr.refresh()
time.sleep(5)
curses.wrapper(main)
إذا قمت بتشغيل المثال ، ستلاحظ أن الشاشة التي تم إنشاؤها بواسطة curses.wrapper
وتلك التي تم إنشاؤها في curses.initscr
عند الاستئناف هي نفس الكائن. وهذا هو ، النافذة التي تم إرجاعها curses.initscr
هو المفرد. هذا يتيح لنا الخروج من اللعنات واستئنافًا كما أعلاه دون الحاجة إلى تحديث كل عنصر واجهة مستخدم self.screen
المراجع في كل مرة.
الخيار الثاني أكثر مشاركة ولكن أيضًا أكثر مرونة. فيما يلي فقط لتمثيل الفكرة الأساسية.
class procWidget():
def __init__(self, stdscr):
# make subwindow / panel
self.proc = subprocess.Popen(my_args, stdout=subprocess.PIPE)
def update(self):
data = self.proc.stdout.readline()
# parse data as necessary
# call addstr() and refresh()
ثم في مكان ما في برنامجك سترغب في الاتصال update
على كل procwidgets الخاصة بك على مؤقت. يمنحك هذا خيار جعل الرياح الفرعية الخاصة بك أي حجم/مكان حتى تتمكن من الحصول على أكبر عدد ممكن من procwidgets. سيتعين عليك إضافة بعض المعالجة عندما تنتهي العملية وغيرها من الأحداث المماثلة بالطبع.