2017-06-23 24 views
1

私は4列[A、B、C、D]を含むwxpython listctrlを持っています。ユーザーは、listctrlから行のいずれかを選択します。今私は私のGUIのボタンをクリックしたときに、その行からD列の値を印刷したいと思っています。たとえば は、ユーザがこの行を選択したことができます:
ユーザーがボタンをクリックすると、[PYTHONを、JAVA、MATLAB、RUBY]
は、今では、出力を与える必要があります:RUBY
私は、このようにwxpython listctrlをonclickボタンイベントでバインドする方法

self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnPlot, self.list) 

self.list.Append((j[0],j[1],j[2],j[3]))  #values are inserted in the listctrl 
をBUTTONを結合しています

OnPlotイベントは次のように定義されています: def OnPlot(self, event): click = event.GetText()

これは動作しません。どのように私はこれを達成することができますか?

答えて

2

イベントがlistctrlから選択された項目のインデックスを渡します。
インデックスを使用して、listctrl内のアイテムとカラムを取得します。この場合は3です。
カラムのテキストを取得します。
すなわち:あなたのコメントや質問のタイトルの編集に関して

self.list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_plot, self.list_ctrl) 

編集:

def on_plot(self, event): 
    ind = event.GetIndex() 
    item = self.list_ctrl.GetItem(ind,3) 
    print item.GetText() 

これは、あなたがこのようなlistctrlを拘束されていることを前提としています。 任意のイベントを何かにバインドすることはできません。ボタンにはlistctrlと同様に定義されたイベントがあり、決して2つのイベントが会うことはありません。問題を回避する方法は、ボタンイベントにボタンをバインドすることです。

plot_button.Bind(wx.EVT_BUTTON, self.on_plot) 

、このようなon_plotを定義します。

def on_plot(self, event): 
    ind = self.list_ctrl.GetFirstSelected() 
    if ind >=0: 
     item = self.list_ctrl.GetItem(ind,3) 
     print item.GetText() 

あなたは既に項目を選択するために、listctrlをクリックしなければならなかった、それは同じ最終結果を達成するが、それは大きいですが、表示されるように。その場合、最初のメソッドを使用して最初の場所でボタンを定義することなく同じ結果を得ている可能性があります。このメソッドを使用すると、何も選択されていない場合にチェックする必要があります(indは-1 )。

+0

ユーザーがボタンをクリックしたときに列Dを印刷したいとします。だから私はこの方法でボタンをバインドする必要があります:self.plot_btn.Bind(wx.EVT_BUTTON、self.OnPlot、self.plot_btn)あなたが言ったようにこの方法でonplotを定義すると、エラーが出ますCommandEventには属性がありません 'GetIndex ' –

+0

あなたのバインドステートメントは 'self.Bind(wx.EVT_LIST_ITEM_SELECTED、self.OnPlot、self.list)でした。' 'ListCtrl'' self.list'でクリックが起こっていると思っていました。 'ListCtrl'がそうしている間に' event'を持っています。そのスニペットだけでなく、コードを投稿する必要があります。私は、ボタンイベントを取得しなければならないと思いますが、不可能ではありませんが、配列を変えるための奇妙な方法である 'listCtrl'イベントを発生させる必要があります。 –

+0

私の編集した回答を参照してください –

0

リストコントロールは私の意見では扱いにくいものです。基本的にははあなたが興味のあるものを列コードで、ハードであるかの行を取得する必要がありますこのような何かが、あなたが始める必要があります。

import wx 


class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial") 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 
     self.index = 0 
     self.current_selection = None 

     self.list_ctrl = wx.ListCtrl(panel, size=(-1,100), 
            style=wx.LC_REPORT 
         |wx.BORDER_SUNKEN 
         ) 
     self.list_ctrl.InsertColumn(0, 'Subject') 
     self.list_ctrl.InsertColumn(1, 'Due') 
     self.list_ctrl.InsertColumn(2, 'Location', width=125) 
     self.list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.on_item_selected) 

     btn = wx.Button(panel, label="Add Line") 
     btn.Bind(wx.EVT_BUTTON, self.add_line) 

     data_getter_btn = wx.Button(panel, label='Get all data') 
     data_getter_btn.Bind(wx.EVT_BUTTON, self.on_get_data) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
     sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 
     sizer.Add(data_getter_btn, 0, wx.ALL|wx.CENTER, 5) 
     panel.SetSizer(sizer) 

    def add_line(self, event): 
     line = "Line %s" % self.index 
     self.list_ctrl.InsertStringItem(self.index, line) 
     self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
     self.list_ctrl.SetStringItem(self.index, 2, "USA") 
     self.index += 1 

    def on_item_selected(self, event): 
     self.current_selection = event.m_itemIndex 

    def on_get_data(self, event): 
     if self.current_selection: 
      print self.current_selection 
      item = self.list_ctrl.GetItem(itemId=self.current_selection, col=2) 
      print item.GetText() 

#---------------------------------------------------------------------- 
# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

上記のコードは、現在の選択(行番号)をプリントアウトし、第3列のテキストあなたはすべての行と列のテキストを印刷したい場合は、このような何かを行うことができます。しかし、各行にオブジェクトを関連付けることであろうこの種のものを達成する

import wx 

######################################################################## 
class MyForm(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial") 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 
     self.index = 0 

     self.list_ctrl = wx.ListCtrl(panel, size=(-1,100), 
         style=wx.LC_REPORT 
         |wx.BORDER_SUNKEN 
         ) 
     self.list_ctrl.InsertColumn(0, 'Subject') 
     self.list_ctrl.InsertColumn(1, 'Due') 
     self.list_ctrl.InsertColumn(2, 'Location', width=125) 

     btn = wx.Button(panel, label="Add Line") 
     btn2 = wx.Button(panel, label="Get Data") 
     btn.Bind(wx.EVT_BUTTON, self.add_line) 
     btn2.Bind(wx.EVT_BUTTON, self.get_data) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
     sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 
     sizer.Add(btn2, 0, wx.ALL|wx.CENTER, 5) 
     panel.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def add_line(self, event): 
     line = "Line %s" % self.index 
     self.list_ctrl.InsertStringItem(self.index, line) 
     self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010") 
     self.list_ctrl.SetStringItem(self.index, 2, "USA") 
     self.index += 1 

    #---------------------------------------------------------------------- 
    def get_data(self, event): 
     """""" 
     count = self.list_ctrl.GetItemCount() 
     cols = self.list_ctrl.GetColumnCount() 
     for row in range(count): 
      for col in range(cols): 
       item = self.list_ctrl.GetItem(itemId=row, col=col) 
       print item.GetText() 

#---------------------------------------------------------------------- 
# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

簡単な方法を。ここに例があります:

import wx 

######################################################################## 
class Car(object): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, make, model, year, color="Blue"): 
     """Constructor""" 
     self.make = make 
     self.model = model 
     self.year = year 
     self.color = color 


######################################################################## 
class MyPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent) 

     rows = [Car("Ford", "Taurus", "1996"), 
       Car("Nissan", "370Z", "2010"), 
       Car("Porche", "911", "2009", "Red") 
       ] 

     self.list_ctrl = wx.ListCtrl(self, size=(-1,100), 
           style=wx.LC_REPORT 
           |wx.BORDER_SUNKEN 
           ) 
     self.list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onItemSelected) 
     self.list_ctrl.InsertColumn(0, "Make") 
     self.list_ctrl.InsertColumn(1, "Model") 
     self.list_ctrl.InsertColumn(2, "Year") 
     self.list_ctrl.InsertColumn(3, "Color") 

     index = 0 
     self.myRowDict = {} 
     for row in rows: 
      self.list_ctrl.InsertStringItem(index, row.make) 
      self.list_ctrl.SetStringItem(index, 1, row.model) 
      self.list_ctrl.SetStringItem(index, 2, row.year) 
      self.list_ctrl.SetStringItem(index, 3, row.color) 
      self.myRowDict[index] = row 
      index += 1 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
     self.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def onItemSelected(self, event): 
     """""" 
     currentItem = event.m_itemIndex 
     car = self.myRowDict[currentItem] 
     print car.make 
     print car.model 
     print car.color 
     print car.year 

######################################################################## 
class MyFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial") 
     panel = MyPanel(self) 
     self.Show() 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

私は本当にListCtrlをそれ以上使用しません。私はObjectListViewを使うほうが使いやすいと思われ、多くの機能を備えています。ここでは、リンクのカップルです:

関連する問題