如何克隆并将事件发布到另一个窗口

时间:2015-10-16 12:07:45

标签: wxpython

我正在尝试更好地理解wxpython管理,并尝试了以下代码。

我基本上想要做的是捕获一个事件,克隆它并将其发送到另一个控件,以便在两个不同的窗口上发生相同的事件。

事件被正确发送到第二个TextCtrl(t2),但似乎没有进一步处理为没有文本。 我的处理方式有什么问题?


import wx

class MyPanel(wx.Panel):
    def __init__(self, parent, id=wx.ID_ANY):
        super().__init__(parent, id)
        sizer = wx.BoxSizer(wx.VERTICAL)

        self.t1 = wx.TextCtrl(self)
        self.t2 = wx.TextCtrl(self)

        self.t1.Bind(wx.EVT_KEY_DOWN, self.OnKey)
        self.t2.Bind(wx.EVT_KEY_DOWN, self.OnKey2)

        sizer.Add(self.t1)
        sizer.Add(self.t2)
        self.SetSizer(sizer)

    def OnKey(self, event):
        print("Event %s on t1 occured" % event.ClassName)
        e2 = event.Clone()
        wx.PostEvent(self.t2, e2)
        event.Skip()

    def OnKey2(self, event):
        print("Event %s from t1 received" % event.ClassName)
        event.Skip()

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        super().__init__(parent, id, 'Events')
        self.panel = MyPanel(self)

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

1 个答案:

答案 0 :(得分:1)

我正在尝试做同样的事情,将滚轮事件重新路由到我的ListCtrl(报告模式),似乎GetWheelRotation返回的值已经是像素 - 即不需要计算弄清楚滚动量!我没有在文档中的任何地方看到过这种支持,我不知道这是否是通用的,但我已经在我的框架上使用了这段代码__init __:

    self.itemList = wx.ListCtrl(self.mainPanel, -1, style=wx.LC_REPORT)
    self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel)

以及后来的我的Frame类:

def OnMouseWheel(self, evt):
    #print "OnMouseWheel"
    r = evt.GetWheelRotation()
    self.itemList.ScrollList(0, -r)
    evt.Skip()

我似乎滚动相同数量的行,无论ListControl或Frame是否处理事件。 (负号是让滚轮在我喜欢的方向滚动列表。它可能不是传统方式或喜欢的方式。)

所以我不会把它放在一些主要产品中,但它对我的小项目来说效果很好。我以为我会发布代码来说明它最终会变得多么容易。