【问题标题】:How to allow UltimateListCtrl to rearrange itself, wxpython如何让 UltimateListCtrl 重新排列自己,wxpython
【发布时间】:2012-01-04 01:24:32
【问题描述】:

如何允许 UltimateListCtrl 能够根据用户输入重新排序/重新排列自身?以下显示了这种能力,但我不确定它是如何完成的。 数据 = { 0:(“3”,“3”,“1”), 1:(“2”,“1”,“2”), 2:(“1”,“2”,“3”) }

import wx
import wx.lib.mixins.listctrl as listmix
from wx.lib.agw import ultimatelistctrl as ULC

class MyList(ULC.UltimateListCtrl, listmix.ColumnSorterMixin):
    def __init__(self, parent, columns):
        ULC.UltimateListCtrl.__init__(self, parent, agwStyle=ULC.ULC_REPORT | ULC.ULC_HAS_VARIABLE_ROW_HEIGHT)
        self.itemDataMap = DATA
        listmix.ColumnSorterMixin.__init__(self, columns)
        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColumn)

    def OnColumn(self, e):
        self.Refresh()
        e.Skip()

    def GetListCtrl(self):
        return self

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.list = MyList(self, 3)
        self.list.InsertColumn(0, "A")
        self.list.InsertColumn(1, "B")
        self.list.InsertColumn(2, "C")

        items = DATA.items()
        for key, data in items:
            index = self.list.Append(data)
            self.list.SetItemData(index, key)

        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

【问题讨论】:

  • The following shows the ability however i am not sure how it can be done。你能改写你的问题吗?我不明白问题是什么。据我所知,您的代码完美无缺。 reorder/rearrange itself with the users input 是什么意思?显示您对给定条目的期望。

标签: python wxpython wxwidgets


【解决方案1】:

也许你要求这样的东西:

class MyList(ULC.UltimateListCtrl, listmix.ColumnSorterMixin):
    def __init__(self, parent, data):
        ULC.UltimateListCtrl.__init__(self, parent, agwStyle=ULC.ULC_REPORT | ULC.ULC_HAS_VARIABLE_ROW_HEIGHT)
        self.data = data
        self.IDoMyself()
        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColumn)

    def IDoMyself(self):
        self.itemDataMap = self.data
        listmix.ColumnSorterMixin.__init__(self, len(self.data))

        self.InsertColumn(0, "A")      # you should generalize this for any size
        self.InsertColumn(1, "B")
        self.InsertColumn(2, "C")

        for key, data in self.data.items():
            index = self.Append(data)
            self.SetItemData(index, key)

    def OnColumn(self, e):
        self.Refresh()
        e.Skip()

    def GetListCtrl(self):
        return self

请注意,您还应该自动化 InsertColumn 过程,以便以编程方式考虑列数。如果您不需要特殊的列名并且只使用几个,您可以使用 string.ascii_uppercase 来获取每列的字母。

然后你在你的框架中实例化这个类:

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        DATA = { 0 : ("3", "3", "1"), 1 : ("2", "1", "2"), 2 : ("1", "2", "3") }
        self.list = MyList(self, DATA)
        self.Show()

我将 DATA 放在这里,但稍微修改了代码,它可以通过 MainWindow(self, DATA) 之类的调用从外部发送。

【讨论】:

  • 我尝试了代码,但是当您的用户尝试重新排列它时,什么也没有发生。 (通过将元素拖动到新位置)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多