كيفية تغيير موضع المؤشر لـ wxRichTextCtrl في معالج الأحداث؟
سؤال
لدي 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)
هل ترى شيئا خاطئا هنا؟يجب أن يكون هناك شيء أفعله خطأ.
المحلول
من الواضح أن هناك مشكلتين في الكود الخاص بك:
أنت تستمع
EVT_KEY_DOWN
, ، والذي ربما تم التعامل معه من قبلEVT_TEXT
, ، الذي يقوم معالجه الافتراضي بتعيين موضع المؤشر.قمت بتعديل
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
(والذي بدوره يتم التعامل معه بعد إضافة الأحرف).إذن ترتيب الأحداث هو:
- مقبض
EVT_KEY_DOWN
- إضافة حرف عند نقطة الإدراج الحالية
- مقبض
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
الكائن، بحيث يعرف معالج الحدث ما إذا كان سيتوقف عن نشر الحدث بعد هذا المعالج.