wxPython ListCtrl 复制到剪贴板

4
我正在使用ListCtrl作为日志文件查看器,这样我可以隐藏“调试”类型的列,以免普通用户混淆。我想能够像许多其他网格类型程序一样选择多个单元格,然后右键单击并说“复制”,然后能够将其粘贴到文本文档,电子邮件等中。我想要能够选择任何连续单元格组合,而不仅限于整行。
有没有内置的功能可以为我完成这项任务?如何实现该功能?我应该切换到虚拟或者ultimate ListCtrl吗?也许我应该使用其他wxPython类?

请看这个链接:http://stackoverflow.com/questions/12780131/copy-and-paste-rows-in-wxpython-using-a-virtual-listctrl - unddoch
是的,我已经看过了那个,还有Ultimate ListCtrl和Virtual。但那并没有给我指引。我注意到TextCtrl有一个右键弹出菜单,对于“免费”来说,它只是在我使用ctrl时出现。但是ListCtrl没有这样的免费赠品。此外,ListCtrl中的选择是基于行的,但我希望选择更像wxGrid。也许使用wxGrid会让我更接近?但这仍然不能让我右键单击复制到剪贴板。 - David Lynch
http://wiki.wxpython.org/PopupMenuOnRightClick 展示了如何制作弹出菜单。如果您需要选择行和列,wxGrid可能会更好用。 - unddoch
1个回答

3
一个可工作的示例:
import wx


class Frame(wx.Frame):

    def __init__(self):
        super(Frame, self).__init__(None, -1, "List copy test", size=(400, 500))

        panel = wx.Panel(self, -1)

        self.listCtrl = wx.ListCtrl(panel, -1, size=(200, 400), style=wx.LC_REPORT)
        self.listCtrl.InsertColumn(0, "Column 1", width=180)

        for i in xrange(10):
            self.listCtrl.InsertStringItem(i, "Item %d" % i)

        self.listCtrl.Bind(wx.EVT_RIGHT_UP, self.ShowPopup)


    def ShowPopup(self, event):
        menu = wx.Menu()
        menu.Append(1, "Copy selected items")
        menu.Bind(wx.EVT_MENU, self.CopyItems, id=1)
        self.PopupMenu(menu)


    def CopyItems(self, event):
        selectedItems = []
        for i in xrange(self.listCtrl.GetItemCount()):
            if self.listCtrl.IsSelected(i):
                selectedItems.append(self.listCtrl.GetItemText(i))

        clipdata = wx.TextDataObject()
        clipdata.SetText("\n".join(selectedItems))
        wx.TheClipboard.Open()
        wx.TheClipboard.SetData(clipdata)
        wx.TheClipboard.Close()

        print "Items are on the clipboard"


app = wx.App(redirect=False)
frame = Frame()
frame.Show()
app.MainLoop()

您提到了列表控件,但如果您想选择多个单元格,则类似于Excel表格的网格控件可能更合适。 思路仍然相同,只是收集列表项(或单元格项)的部分不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接