我正在尝试更好地理解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()
答案 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是否处理事件。 (负号是让滚轮在我喜欢的方向滚动列表。它可能不是传统方式或你喜欢的方式。)
所以我不会把它放在一些主要产品中,但它对我的小项目来说效果很好。我以为我会发布代码来说明它最终会变得多么容易。