【问题标题】:wx.python bind event to editableListBox list item'swxpython 将事件绑定到可编辑的 ListBox 列表项
【发布时间】:2015-11-04 22:57:44
【问题描述】:

我正在寻找一种将函数绑定到从选择 wx.gizmos 可编辑列表框中的列表项触发的事件的方法。我希望选择用用户可以编辑的字符串填充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 演示示例时,我找不到解决方案。谷歌也没有多大帮助。我已经尝试过 Boa Constructor 并将一些事件绑定到可编辑列表框。以下是我尝试过的绑定,虽然没有一个有效:

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() 和事情是我在尝试但未能理解正在发生的事情。运行时控制台中也没有产生错误,所以我真的不知道从哪里开始。

谢谢

【问题讨论】:

    标签: python python-2.7 wxpython wxwidgets


    【解决方案1】:

    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.EVT_LIST_ITEM_SELECTED 收到 event.Text,我需要找到更多事件的事件属性,例如 EVT_LIST_INSERT_ITEM(等等...),我在哪里可以找到其他事件的文档。[属性]?我已经尝试了 event.GetItemText 以及文档中的许多其他方法和事件(wx.EVT),希望通过反复试验,一些无法编程的东西会起作用。我想我正在寻找包含代码示例的文档来理解 wxPython 的文档。或者至少每个 wx.EVT 有哪些 event.attr 可用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多