سؤال

بادئ ذي بدء .. آسف إذا كانت لغتي الإنجليزية سيئة. لها لغتي الثالثة
أنا أعمل على برنامج الطلاء الذي يرسم على الصور وحفظها مرة أخرى (لاقتراح التعليق)
أنا استخدم كومة و wxpython. لكن ما زلت تواجه مشاكل مع بعض الميزات ..
ما هي الطريقة المثالية لجعل خيار التراجع؟
سؤال آخر .. عند قياس المستخدم الصورة (عن طريق توسيع إطار الرسم) الخطوط لا الحجم. كيف أحدث ذلك.

لقد تخلصت من كل هذه المشاكل عن طريق حفظ الصور المؤقتة إلى القرص الثابت كلما انتهك المستخدم من خط وتعيين صورة جديدة (الشخص القديم مع خط عليه) إلى الإطار. سيتم التراجع وإعادة الإعادة عن طريق التبديل بين هذه الصور ... لذلك عند حجم المستخدم صورة سيقوم الخط أيضا. ولكن هذا أمر سيء لأنه يأخذ الكثير من مساحة الأقراص الصلبة (عند رسم 1000 خطوط) وبطيء لأنه يعين صورة جديدة في كل مرة يقوم فيها المستخدم بسحب خط

آمل أن تكون فكرتي واضحة

هل لديها أفضل حل ؟

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

المحلول

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

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

+---------+
| state_0 |
+---------+       +---------+
| next   -------> | stack_0 |
+---------+       +---------+
                  | data    |       +---------+
                  | next   -------> | state_1 |
                  +---------+       +---------+
                                    | next   ----- ...
                                    +---------+

كل stack_i يحمل الأوامر حتى يتجاوز بعض التعقيد المحدد مسبقا (على سبيل المثال، تتجاوز الأوامر تكلفة حسابية X) أو ترتيبي (مثل كومة تحمل X أو أكثر من الأوامر) الحد. في تلك المرحلة، كائن دولة وسيطة جديدة state_i+1 يتم إنشاؤها لتغليف الدولة، ومكدسة جديدة فارغة stack_i+1 يتم إنشاؤها لعقد أوامر جديدة.

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

نصائح أخرى

أيضا، ضع في اعتبارك أن وظائف Python هي كائنات من الدرجة الأولى، والتي يمكن أن تجعل تنفيذ نمط الأمر على نحو سلس للغاية:

actions = []

def do_action1(arg1, arg2):
    # .. do the action ..

    # remember we did the action:
    actions.append(do_action1, (arg1, arg2))

def do_action2(arg1, arg2):
    # .. do the action ..
    actions.append(do_action2, (arg1, arg2))

def replay_actions():
    for fn, args in actions:
        fn(*args)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top