كسبيثون: التعامل مع الأحداث في القطعة التي هي داخل جهاز كمبيوتر محمول
-
05-07-2019 - |
سؤال
ولدي دفتر كسبيثون، في هذه الحالة wx.aui.AuiNotebook
. (ولكن لم يحدث هذه المشكلة مع أنواع أخرى من أجهزة الكمبيوتر المحمولة أيضا.) في دفتر ملاحظاتي لدي القطعة، في هذه الحالة فئة فرعية من ScrolledPanel
، والتي أحاول القيام ببعض حدث مخصص التعامل مع (لwx.EVT_KEY_DOWN
). ومع ذلك، لم يتم التعامل مع الأحداث. راجعت قانون بلدي خارج من دفتر الملاحظات، والتعامل مع الحدث الأعمال، ولكن عندما أضع القطعة في دفتر الملاحظات، لا يبدو معالج الأحداث للحصول على الاحتجاج عندما يحدث هذا الحدث.
هل دفتر كتلة على نحو ما حدث؟ كيف يمكنني حل هذا؟
المحلول
وحاولت استنساخ مشكلتك لكنه يعمل بشكل جيد بالنسبة لي. الشيء الوحيد الذي يمكنني أن أفكر في أن يكون هناك واحد من الفصول الدراسية الذي يربط أيضا إلى wx.EVT_KEY_DOWN
ولا يدعو <لأ href = "http://www.wxpython.org/docs/api/wx.Event-class. أتش تي أم أل # تخطي "يختلط =" نوفولو noreferrer "> wx.Event.Skip () في رد الاتصال به. ومن شأن ذلك أن منع مزيد من التعامل مع الحدث. إذا حصلت لوحة الخاص بك تمريره ليكون المصب مثل كائن في سلسلة من معالجات الأحداث أنها لن ترى هذا الحدث.
لمرجعية، وهنا مثال التي عملت بالنسبة لي (ويندوز). هل ما تفعلونه تختلف كثيرا عن هذا؟
import wx
import wx.aui, wx.lib.scrolledpanel
class AppFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
# The notebook
self.nb = wx.aui.AuiNotebook(self)
# Create a scrolled panel
panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1)
panel.SetupScrolling()
self.add_panel(panel, 'Scrolled Panel')
# Create a normal panel
panel = wx.Panel(self, -1)
self.add_panel(panel, 'Simple Panel')
# Set the notebook on the frame
self.sizer = wx.BoxSizer()
self.sizer.Add(self.nb, 1, wx.EXPAND)
self.SetSizer(self.sizer)
# Status bar to display the key code of what was typed
self.sb = self.CreateStatusBar()
def add_panel(self, panel, name):
panel.Bind(wx.EVT_KEY_DOWN, self.on_key)
self.nb.AddPage(panel, name)
def on_key(self, event):
self.sb.SetStatusText("key: %d [%d]" % (event.GetKeyCode(), event.GetTimestamp()))
event.Skip()
class TestApp(wx.App):
def OnInit(self):
frame = AppFrame(None, -1, 'Click on a panel and hit a key')
frame.Show()
self.SetTopWindow(frame)
return 1
if __name__ == "__main__":
app = TestApp(0)
app.MainLoop()