سؤال

لقد بدأت للتو في استخدام Pycairo ، وواجهت الخطأ التالي المثير للاهتمام. يقوم البرنامج الذي أكتبه بإنشاء نافذة GTK بسيطة ، ويرسم مستطيلًا عليه ، ثم لديه رد اتصال لرسم خط عشوائي على أي نوع من إدخال لوحة المفاتيح. ومع ذلك ، يبدو أنه مع كل إدخال لوحة مفاتيح ، يجب أن أقوم بإنشاء سياق جديد ، أو أحصل على خطأ في اللحظة التي يتلقى فيها البرنامج إدخال لوحة المفاتيح الأول (على وجه التحديد ، على خط.). الخطأ كما يلي ، إذا كان الأمر مهمًا. "باددرال القابلة للتشويش (PIXMAP غير صالح أو معلمة النافذة)". (التفاصيل: Serial 230 error_code 9 request_code 53 minor_code 0)

#! /usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk, gobject, cairo, math, random
# Create a GTK+ widget on which we will draw using Cairo
class Screen(gtk.DrawingArea):
# Draw in response to an expose-event
  __gsignals__ = { "expose-event": "override" }

  # Handle the expose-event by drawing
  def do_expose_event(self, event):
    # Create the cairo context
    self.cr = self.window.cairo_create()
    # Restrict Cairo to the exposed area; avoid extra work
    self.cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
    self.cr.clip()

    self.draw(*self.window.get_size())

  def key_press_event(self, *args):
    # print args
    self.cr = self.window.cairo_create() # This is the line I have to add
    # in order to make this function not throw the error. Note that cr is only
    # given as attribute of self in order to stop it going out of scope when this line
    # doesn't exist
    self.cr.set_source_rgb(random.random(), random.random(), random.random())
    self.cr.move_to(*[z/2.0 for z in self.window.get_size()])
    self.cr.line_to(*[z*random.random() for z in self.window.get_size()])
    self.cr.stroke()

  def draw(self, width, height):
    # Fill the background with gray
    self.cr.set_source_rgb(.5,.5,.5)
    self.cr.rectangle(0, 0, width,height)
    self.cr.fill()

    self.cr.set_source_rgb(1,0,0)
    self.cr.arc(width/2.0, height/2.0, min(width,height)/2.0 - 20.0, 0.0, 2.0*math.pi)
    self.cr.stroke()

#create a gtk window, attach to exit button, and whatever is passed as arg becomes the body of the window. AWESOME
def run(Widget):
  window = gtk.Window()
  widget = Widget()
  window.connect("delete-event", gtk.main_quit)
  window.connect('key-press-event',widget.key_press_event)
  widget.show()
  window.add(widget)
  window.present()
  gtk.main()

if __name__ == "__main__":
  run(Screen)

شكرا لمساعدتك!

(تحديث: كنت ألعب ، وأدركت ما يلي: عندما أقوم بتغيير حجم النافذة ، يتم حذف جميع الكائنات الجديدة التي تمت إضافتها (أو على الأقل لا تظهر بعد الآن؟))

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

المحلول

رسومات القاهرة لا تستمر على الإطلاق. (من الأفضل ألا تفكر فيهم على أنهم "كائنات" - إنها ليست مثل مكتبة قماش حيث يمكنك تحريكها أو تحويلها بعد رسمها) سوف تختفي ، كما اكتشفت ، كلما تم إعادة رسم النافذة.

لا يستمر سياق القاهرة بسبب التخزين المؤقت المزدوج: انظر ملاحظة في وثائق C, ، والتي للأسف لم أتمكن من العثور على أي مكان في وثائق PYGTK.

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

نصائح أخرى

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

إليك مثال على استخدام مكتبة رسومات الهامستر التي تفعل ذلك فقط:

https://github.com/projecthamster/experiments/blob/master/many_lines.py

العديد من نكهات الثبات للمناقشة:

الرسومات على بعض الأسطح لا تستمر: أسطح واجهة المستخدم الرسومية. يجب عليك إعادة رسمها في مكافحة رد الاتصال.

لا ينبغي التعامل مع كائنات Pycairo ككائنات ثابتة ، فقط كواجهة لوظائف مكتبة القاهرة في C.

لا تستمر محتويات (مسارات وملء) سياقات القاهرة خارج عملية السكتة الدماغية () أو ملء ().

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

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

استمرار الذاكرة هو ثباتك الحقيقي ، أو ينبغي أن أقول سريالية.

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