0

wxPython は初めてなので、お手柔らかにお願いします。

ユーザーがマウスの右ボタンを押したときにコンテキスト メニュー ポップアップを介して制御される仮想リスト コントロールを作成しようとしています。

私の少しの経験から、仮想リスト コントロールは「項目」(「行」と読む) と「列」の番号を操作するのが好きなようです。けっこうだ。

右クリック イベントを受け取ったら、event.GetIndex() を呼び出すだけで簡単に行 (項目) 番号を取得できます。しかし、クリックされたオブジェクトの列番号を取得するにはどうすればよいでしょうか?

import wx
import wx.lib.agw.ultimatelistctrl as ULC

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Right-click example")
        self.list = MyListCtrl(parent=self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.list, 1, wx.EXPAND)
        self.SetSizer(sizer)

class MyListCtrl(ULC.UltimateListCtrl):
     def __init__(self, parent, *args, **kwargs):
         ULC.UltimateListCtrl.__init__(self, parent, 1, agwStyle=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)

        self.InsertColumn(0, "Column0")
        self.InsertColumn(1, "Column1")
        self.SetItemCount(5)
        # Bindings
        self.Bind(ULC.EVT_LIST_ITEM_RIGHT_CLICK, self.OnRightClick)

    def OnGetItemText(self, item, column):
        return "%d, %d" % (item, column)

    def OnGetItemToolTip(self, item, column):
        pass

    def OnGetItemTextColour(self, item, column):
        pass

    def OnRightClick(self, event):
        # Get the index (i.e. which row was clicked)
        print("OnColRightClick: GetIndex = %r\n" %(event.GetIndex()))
        # How can I get which column was clicked?

if __name__ == "__main__":
    # Start the GUI
    app = wx.App()
    frame = MyFrame()
    app.SetTopWindow(frame)
    frame.Show()
    app.MainLoop()
4

6 に答える 6

1

行をクリックしたときにlistctrlで列番号を取得できるかどうかはわかりません(単一のセルではなく行全体を選択するため)...ただし、列をクリックしたときに列の番号が必要な場合(私がやったように、多くの検索がここに行き着いた後)イベント(wx.EVT_LIST_COL_CLICK/wx.EVT_LIST_COL_RIGHT_CLICK)をlistctrlにバインドし、イベントメソッドでevent.m_colを使用できます...そこに列番号を保存します

    self.Bind(wx.EVT_LIST_COL_CLICK, self.onColumnClick, self.myListCtrl)
...
def onColumnClick(self, evt):
    column_clicked = evt.m_col

ここからインスピレーションを得ました: http://wxpython.org/Phoenix/docs/html/ListCtrl.htmlの「このクラスによって発行されるイベント」セクション

于 2013-02-15T22:32:25.767 に答える
1

「最初にうまくいかなかったら、もう一度やり直してください。それからやめてください。ばかになっても仕方がありません。」 - マーク・トウェイン

これで1週間無駄にしたことを認めるのは恥ずかしい. 他の人が同じ罠に陥るのを避けるために、単純化してみましょう。

一緒に表示したいサブ要素がそれぞれにあるが、グループとして操作したいもののリストがある場合は、ListCtrl が機能する可能性があります。

物事のリストがあり、それぞれにサブ要素があり、それらのサブ要素を個別に操作することに関心がある場合、ListCtrlは必要なものではないようです。

私は Grid ウィジェットを使い始めましたが、これまでのところ、私の目的には合っているようです。これは後で私を噛むようになるかもしれませんが、今のところうまくいっているようです. 以下は、グリッド ウィジェットをクリックすると行と列の両方の「アドレス」返される方法を示すために、Wx Huge Grid デモのコードを少し変更したものです。

ListCtrl から列番号を取得する方法について提案があれば、私は確かに耳を傾けています。

import  wx
import  wx.grid as  gridlib

#---------------------------------------------------------------------------
class HugeTable(gridlib.PyGridTableBase):
    def __init__(self, log):
        gridlib.PyGridTableBase.__init__(self)
        self.log = log

        self.odd=gridlib.GridCellAttr()
        self.odd.SetBackgroundColour("sky blue")
        self.even=gridlib.GridCellAttr()
        self.even.SetBackgroundColour("sea green")

    def GetAttr(self, row, col, kind):
        attr = [self.even, self.odd][row % 2]
        attr.IncRef()
        return attr

    # This is all it takes to make a custom data table to plug into a
    # wxGrid.  There are many more methods that can be overridden, but
    # the ones shown below are the required ones.  This table simply
    # provides strings containing the row and column values.

    def GetNumberRows(self):
        return 10000

    def GetNumberCols(self):
        return 10000

    def IsEmptyCell(self, row, col):
        return False

    def GetValue(self, row, col):
        return str( (row, col) )

    def SetValue(self, row, col, value):
        self.log.write('SetValue(%d, %d, "%s") ignored.\n' % (row, col, value))

#---------------------------------------------------------------------------
 class HugeTableGrid(gridlib.Grid):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)

        table = HugeTable(log)

        # The second parameter means that the grid is to take ownership of the
        # table and will destroy it when done.  Otherwise you would need to keep
        # a reference to it and call it's Destroy method later.
        self.SetTable(table, True)

        self.Bind(gridlib.EVT_GRID_CELL_RIGHT_CLICK, self.OnCellRightClick)

    def OnCellRightClick(self, event):
        print "OnCellRightClick: (%d,%d)\n" % (event.GetRow(), event.GetCol())

#---------------------------------------------------------------------------
 class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, -1, "Huge (virtual) Table Demo", size=(640,480))
        grid = HugeTableGrid(self, log)

        grid.SetReadOnly(5,5, True)

#---------------------------------------------------------------------------
if __name__ == '__main__':
    import sys
    app = wx.App()
    frame = TestFrame(None, sys.stdout)
    frame.Show(True)
    app.MainLoop()
于 2012-07-29T23:40:05.673 に答える
1

残念ながら、列情報を取得する良い方法はありません。私はこの問題についてこの議論を見つけました: http://wxpython-users.1045709.n5.nabble.com/Getting-row-col-of-selected-cell-in-ListCtrl-td2360831.html

自分で計算するしかないようです。Robin によると、wx.lib.mixins.listctrl.TextEditMixin に役立つコードがいくつかあります。また、役立つかもしれない ObjectListView ( ListCtrlのラッパー) のレシピも見つけました。

于 2012-07-30T14:31:10.347 に答える