wx.python 将事件绑定到可编辑的 ListBox 列表项
wx.python bind event to editableListBox list item's
我正在寻找一种方法来将函数绑定到从 wx.gizmos editableListBox 中选择列表项触发的事件。我希望选择用用户可以编辑的字符串填充 richTextCtrl1。
为了清楚起见,下面是 UI 设计的快速模型,因为我的实际应用程序要大得多。
import wx
import wx.richtext
import wx.gizmos
def create(parent):
return myFrame(parent)
[wxID_MYFRAME, wxID_MYFRAMEMYEITABLELISTBOX, wxID_MYFRAMEMYFRAME_PANEL,
wxID_MYFRAMERICHTEXTCTRL1,
] = [wx.NewId() for _init_ctrls in range(4)]
class myFrame(wx.Frame):
def _init_ctrls(self, prnt):
wx.Frame.__init__(self, id=wxID_MYFRAME, name=u'myFrame', parent=prnt,
pos=wx.Point(551, 188), size=wx.Size(500, 500),
style=wx.DEFAULT_FRAME_STYLE, title=u'myPanel')
self.SetClientSize(wx.Size(498, 466))
self.SetInitialSize(wx.Size(500, 500))
self.myFrame_panel = wx.Panel(id=wxID_MYFRAMEMYFRAME_PANEL,
name=u'myFrame_panel', parent=self, pos=wx.Point(0, 0),
size=wx.Size(498, 466), style=wx.TAB_TRAVERSAL)
self.myEitableListBox = wx.gizmos.EditableListBox(id=wxID_MYFRAMEMYEITABLELISTBOX,
label=u'myEitableListBox', name=u'myEitableListBox',
parent=self.myFrame_panel, pos=wx.Point(8, 56), size=wx.Size(200,
248))
self.myEitableListBox.SetStrings(['this', 'that', 'other'])
self.richTextCtrl1 = wx.richtext.RichTextCtrl(id=wxID_MYFRAMERICHTEXTCTRL1,
parent=self.myFrame_panel, pos=wx.Point(224, 64),
size=wx.Size(248, 240), style=wx.richtext.RE_MULTILINE,
value=u'')
self.richTextCtrl1.SetLabel(u'')
def __init__(self, parent):
self._init_ctrls(parent)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = create(None)
frame.Show()
app.MainLoop()
我在查看 wx.python 演示示例时找不到解决方案。 Google 也没有多大帮助。我试过 Boa Constructor 并将一些事件绑定到可编辑列表框。以下是我尝试过的绑定,尽管 none 有效:
self.myEitableListBox.Bind(wx.EVT_SYS_COLOUR_CHANGED,
self.OnmyEitableListBoxSysColourChanged)
self.myEitableListBox.Bind(wx.EVT_SET_FOCUS, self.OnmyEitableListBoxSetFocus)
self.myEitableListBox.Bind(wx.EVT_LEFT_DOWN, self.OnmyEitableListBoxLeftDown)
def OnmyEitableListBoxSysColourChanged(self, event):
print self.myEitableListBox.GetSelection()
print "fired"
event.Skip()
def OnmyEitableListBoxSetFocus(self, event):
print self.myEitableListBox.GetSelection(self)
print "fired"
event.Skip()
def OnmyEitableListBoxLeftDown(self, event):
print self.myEitableListBox.GetSelection()
lb = event.GetEventObject()
data = lb.GetClientData(lb.GetSelection())
print "fired", data
event.Skip()
我一直在阅读文档并试图找到 wx.python 的 tuts。我所发现的一切都无法帮助我理解如何获得选定的列表项。如果我可以获得选定的列表项,我想我可以创建填充 ritchTextFeild 的函数。我不应该认为 GetSelection() 和事情是我在尝试但未能理解正在发生的事情。 运行 时控制台中也没有生成错误,所以我真的不知道从这里去哪里。
谢谢
EditableListBox 实际上包含一个 ListCtrl,使用 self.myEitableListBox.ListCtrl 可以访问控件,通过使用返回的对象可以绑定事件。
添加了几行代码的以下示例将在选择 EditableListBox 中的项目时将其添加到富文本控件。
import wx
import wx.richtext
import wx.gizmos
def create(parent):
return myFrame(parent)
[wxID_MYFRAME, wxID_MYFRAMEMYEITABLELISTBOX, wxID_MYFRAMEMYFRAME_PANEL,
wxID_MYFRAMERICHTEXTCTRL1,
] = [wx.NewId() for _init_ctrls in range(4)]
class myFrame(wx.Frame):
def _init_ctrls(self, prnt):
wx.Frame.__init__(self, id=wxID_MYFRAME, name=u'myFrame', parent=prnt,
pos=wx.Point(551, 188), size=wx.Size(500, 500),
style=wx.DEFAULT_FRAME_STYLE, title=u'myPanel')
self.SetClientSize(wx.Size(498, 466))
self.SetInitialSize(wx.Size(500, 500))
self.myFrame_panel = wx.Panel(id=wxID_MYFRAMEMYFRAME_PANEL,
name=u'myFrame_panel', parent=self, pos=wx.Point(0, 0),
size=wx.Size(498, 466), style=wx.TAB_TRAVERSAL)
self.myEitableListBox = wx.gizmos.EditableListBox(id=wxID_MYFRAMEMYEITABLELISTBOX,
label=u'myEitableListBox', name=u'myEitableListBox',
parent=self.myFrame_panel, pos=wx.Point(8, 56), size=wx.Size(200,
248))
self.myEitableListBox.SetStrings(['this', 'that', 'other'])
self.richTextCtrl1 = wx.richtext.RichTextCtrl(id=wxID_MYFRAMERICHTEXTCTRL1,
parent=self.myFrame_panel, pos=wx.Point(224, 64),
size=wx.Size(248, 240), style=wx.richtext.RE_MULTILINE,
value=u'')
self.richTextCtrl1.SetLabel(u'')
self.myEitableListBox.ListCtrl.Bind(
wx.EVT_LIST_ITEM_SELECTED, self.on_listbox)
def __init__(self, parent):
self._init_ctrls(parent)
def on_listbox(self, event):
text = '{}\n'.format(event.Text)
self.richTextCtrl1.AppendText(text)
if __name__ == '__main__':
app = wx.App()
frame = create(None)
frame.Show()
app.MainLoop()
因为使用了折旧的 PySimpleApp,所以出现错误,请改用我在上面的代码中也更改过的 App。
我正在寻找一种方法来将函数绑定到从 wx.gizmos editableListBox 中选择列表项触发的事件。我希望选择用用户可以编辑的字符串填充 richTextCtrl1。
为了清楚起见,下面是 UI 设计的快速模型,因为我的实际应用程序要大得多。
import wx
import wx.richtext
import wx.gizmos
def create(parent):
return myFrame(parent)
[wxID_MYFRAME, wxID_MYFRAMEMYEITABLELISTBOX, wxID_MYFRAMEMYFRAME_PANEL,
wxID_MYFRAMERICHTEXTCTRL1,
] = [wx.NewId() for _init_ctrls in range(4)]
class myFrame(wx.Frame):
def _init_ctrls(self, prnt):
wx.Frame.__init__(self, id=wxID_MYFRAME, name=u'myFrame', parent=prnt,
pos=wx.Point(551, 188), size=wx.Size(500, 500),
style=wx.DEFAULT_FRAME_STYLE, title=u'myPanel')
self.SetClientSize(wx.Size(498, 466))
self.SetInitialSize(wx.Size(500, 500))
self.myFrame_panel = wx.Panel(id=wxID_MYFRAMEMYFRAME_PANEL,
name=u'myFrame_panel', parent=self, pos=wx.Point(0, 0),
size=wx.Size(498, 466), style=wx.TAB_TRAVERSAL)
self.myEitableListBox = wx.gizmos.EditableListBox(id=wxID_MYFRAMEMYEITABLELISTBOX,
label=u'myEitableListBox', name=u'myEitableListBox',
parent=self.myFrame_panel, pos=wx.Point(8, 56), size=wx.Size(200,
248))
self.myEitableListBox.SetStrings(['this', 'that', 'other'])
self.richTextCtrl1 = wx.richtext.RichTextCtrl(id=wxID_MYFRAMERICHTEXTCTRL1,
parent=self.myFrame_panel, pos=wx.Point(224, 64),
size=wx.Size(248, 240), style=wx.richtext.RE_MULTILINE,
value=u'')
self.richTextCtrl1.SetLabel(u'')
def __init__(self, parent):
self._init_ctrls(parent)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = create(None)
frame.Show()
app.MainLoop()
我在查看 wx.python 演示示例时找不到解决方案。 Google 也没有多大帮助。我试过 Boa Constructor 并将一些事件绑定到可编辑列表框。以下是我尝试过的绑定,尽管 none 有效:
self.myEitableListBox.Bind(wx.EVT_SYS_COLOUR_CHANGED,
self.OnmyEitableListBoxSysColourChanged)
self.myEitableListBox.Bind(wx.EVT_SET_FOCUS, self.OnmyEitableListBoxSetFocus)
self.myEitableListBox.Bind(wx.EVT_LEFT_DOWN, self.OnmyEitableListBoxLeftDown)
def OnmyEitableListBoxSysColourChanged(self, event):
print self.myEitableListBox.GetSelection()
print "fired"
event.Skip()
def OnmyEitableListBoxSetFocus(self, event):
print self.myEitableListBox.GetSelection(self)
print "fired"
event.Skip()
def OnmyEitableListBoxLeftDown(self, event):
print self.myEitableListBox.GetSelection()
lb = event.GetEventObject()
data = lb.GetClientData(lb.GetSelection())
print "fired", data
event.Skip()
我一直在阅读文档并试图找到 wx.python 的 tuts。我所发现的一切都无法帮助我理解如何获得选定的列表项。如果我可以获得选定的列表项,我想我可以创建填充 ritchTextFeild 的函数。我不应该认为 GetSelection() 和事情是我在尝试但未能理解正在发生的事情。 运行 时控制台中也没有生成错误,所以我真的不知道从这里去哪里。
谢谢
EditableListBox 实际上包含一个 ListCtrl,使用 self.myEitableListBox.ListCtrl 可以访问控件,通过使用返回的对象可以绑定事件。
添加了几行代码的以下示例将在选择 EditableListBox 中的项目时将其添加到富文本控件。
import wx
import wx.richtext
import wx.gizmos
def create(parent):
return myFrame(parent)
[wxID_MYFRAME, wxID_MYFRAMEMYEITABLELISTBOX, wxID_MYFRAMEMYFRAME_PANEL,
wxID_MYFRAMERICHTEXTCTRL1,
] = [wx.NewId() for _init_ctrls in range(4)]
class myFrame(wx.Frame):
def _init_ctrls(self, prnt):
wx.Frame.__init__(self, id=wxID_MYFRAME, name=u'myFrame', parent=prnt,
pos=wx.Point(551, 188), size=wx.Size(500, 500),
style=wx.DEFAULT_FRAME_STYLE, title=u'myPanel')
self.SetClientSize(wx.Size(498, 466))
self.SetInitialSize(wx.Size(500, 500))
self.myFrame_panel = wx.Panel(id=wxID_MYFRAMEMYFRAME_PANEL,
name=u'myFrame_panel', parent=self, pos=wx.Point(0, 0),
size=wx.Size(498, 466), style=wx.TAB_TRAVERSAL)
self.myEitableListBox = wx.gizmos.EditableListBox(id=wxID_MYFRAMEMYEITABLELISTBOX,
label=u'myEitableListBox', name=u'myEitableListBox',
parent=self.myFrame_panel, pos=wx.Point(8, 56), size=wx.Size(200,
248))
self.myEitableListBox.SetStrings(['this', 'that', 'other'])
self.richTextCtrl1 = wx.richtext.RichTextCtrl(id=wxID_MYFRAMERICHTEXTCTRL1,
parent=self.myFrame_panel, pos=wx.Point(224, 64),
size=wx.Size(248, 240), style=wx.richtext.RE_MULTILINE,
value=u'')
self.richTextCtrl1.SetLabel(u'')
self.myEitableListBox.ListCtrl.Bind(
wx.EVT_LIST_ITEM_SELECTED, self.on_listbox)
def __init__(self, parent):
self._init_ctrls(parent)
def on_listbox(self, event):
text = '{}\n'.format(event.Text)
self.richTextCtrl1.AppendText(text)
if __name__ == '__main__':
app = wx.App()
frame = create(None)
frame.Show()
app.MainLoop()
因为使用了折旧的 PySimpleApp,所以出现错误,请改用我在上面的代码中也更改过的 App。