كيفية تغيير موضع المؤشر لـ wxRichTextCtrl في معالج الأحداث؟

StackOverflow https://stackoverflow.com/questions/622417

سؤال

لدي RichTextCtrl في تطبيقي، والذي يحتوي على معالج لـ EVT_KEY_DOWN.الكود الذي يتم تنفيذه هو التالي:


def move_caret(self):
    pdb.set_trace()
    self.rich.GetCaret().Move((0,0))
    self.Refresh()


def onClick(self,event):
    self.move_caret()
    event.Skip()

ثري هو RichTextCtrl الخاص بي.

وهنا ما أود أن أفعله:

  • عند كل ضغطة على المفتاح، قم بإضافة المفتاح إلى عنصر التحكم ( وهو السلوك الافتراضي )

  • حرك المؤشر في بداية عنصر التحكم، الموضع الأول

وإليك ما يفعله في الواقع:

  • يضيف المفتاح إلى عنصر التحكم

  • لقد قمت بفحص موضع علامة الإقحام، وأبلغ مصحح الأخطاء أنه موجود عند 0,0 ولكن في عنصر التحكم، فإنه يومض في الموضع الحالي (وهو الموضع قبل الضغط على المفتاح + 1)

هل ترى شيئا خاطئا هنا؟يجب أن يكون هناك شيء أفعله خطأ.

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

المحلول

من الواضح أن هناك مشكلتين في الكود الخاص بك:

  1. أنت تستمع EVT_KEY_DOWN, ، والذي ربما تم التعامل معه من قبل EVT_TEXT, ، الذي يقوم معالجه الافتراضي بتعيين موضع المؤشر.

  2. قمت بتعديل Caret الكائن بدلاً من الاستخدام SetInsertionPoint الطريقة، التي تقوم بتحريك علامة الإقحام وجعل الحرف التالي يظهر في مكان معين.

لذا فإن المثال العملي (لقد اختبرته وهو يعمل كما تريد) سيكون:

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_TEXT, self.onClick)

def onClick(self, event):
    self.rich.SetInsertionPoint(0) # No refresh necessary.
    event.Skip()

يحرر:إذا كنت تريد إضافة النص في النهاية، مع بقاء المؤشر في البداية (انظر التعليقات)، فيمكنك الاستفادة من حقيقة ذلك EVT_KEY_DOWN يتم التعامل معها من قبل EVT_TEXT (والذي بدوره يتم التعامل معه بعد إضافة الأحرف).إذن ترتيب الأحداث هو:

  1. مقبض EVT_KEY_DOWN
  2. إضافة حرف عند نقطة الإدراج الحالية
  3. مقبض EVT_TEXT

إضافة معالج EVT_KEY_DOWN الذي ينقل نقطة الإدراج إلى النهاية قبل إضافة الحرف فعليًا يؤدي المهمة بشكل جيد جدًا.لذا، بالإضافة إلى الكود المذكور سابقًا، اكتب:

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)

def onKeyDown(self, event):
    self.rich.SetInsertionPointEnd()
    event.Skip()

بالمناسبة، event.Skip() لا يستدعي معالج الحدث التالي على الفور، بل يقوم فقط بتعيين علامة في ملف event الكائن، بحيث يعرف معالج الحدث ما إذا كان سيتوقف عن نشر الحدث بعد هذا المعالج.

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