2015-11-04 102 views
0

我正在尋找一種方法將函數綁定到從wx.gizmos editableListBox中選擇列表項所觸發的事件。我想要選擇用一個可以由用戶編輯的字符串來填充richTextCtrl1。wx.python將事件綁定到editableListBox列表項的

下面是沒有事件綁定或函數的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構造函數,並將一些事件綁定到可編輯列表框。下面是我曾嘗試雖然沒有工作過的綁定:

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()和事情是我在嘗試並且無法理解正在發生的事情。在運行時也沒有在控制檯中產生錯誤,所以我真的不知道從哪裏去。

感謝

回答

0

EditableListBox實際上包含的ListCtrl,以訪問控制使用self.myEitableListBox.ListCtrl,通過返回的對象可以綁定事件。

以下代碼中添加了幾行代碼的示例將在選擇EditableListBox中的項目時將其添加到richtext控件中。

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代替我也在上面的代碼改變。

+0

您收到來自wx.EVT_LIST_ITEM_SELECTED的event.Text, 我需要找到EVT_LIST_INSERT_ITEM(etc ...)等更多事件的事件屬性,我可以從哪裏找到其他事件的文檔。我試過event.GetItemText和許多其他方法和事件(wx.EVT的)從希望通過試驗和錯誤的文件的東西將工作,這是沒有辦法編程。我想我正在尋找具有代碼示例來了解wxPython文檔的文檔。或者至少每個wx.EVT有哪些event.attr可用? – bobZBy