wxPython ObjectListView捕获Ctrl-C快捷方式

wxPython ObjectListView捕获Ctrl-C快捷方式,wxpython,py2exe,objectlistview,Wxpython,Py2exe,Objectlistview,我在使用Python 2.9.5、ObjectListView 1.2、lxml 2.3和SQLAlchemy 0.8.2编写Python 2.7.5程序并使用py2exe编译成exe时遇到困难 我遇到的问题是,在将程序编译成exe后,我无法再使用Ctrl-C从ObjectListView复制数据,并将其粘贴到其他程序中,如Excel、记事本,甚至记事本++。无论选择了多少行进行复制/粘贴,都会发生这种情况。粘贴到Excel时,我得到的结果是“Microsoft Excel无法粘贴数据”。当我尝

我在使用Python 2.9.5、ObjectListView 1.2、lxml 2.3和SQLAlchemy 0.8.2编写Python 2.7.5程序并使用py2exe编译成exe时遇到困难

我遇到的问题是,在将程序编译成exe后,我无法再使用Ctrl-C从ObjectListView复制数据,并将其粘贴到其他程序中,如Excel、记事本,甚至记事本++。无论选择了多少行进行复制/粘贴,都会发生这种情况。粘贴到Excel时,我得到的结果是“Microsoft Excel无法粘贴数据”。当我尝试使用记事本时,我从第一列和第一行(我认为它是第一行)得到第一个字母,但没有其他内容

下面是我遇到问题的一个输出窗口的代码片段(总共有两个,但它们几乎是彼此的完美镜像)。这由主脚本导入,然后作为页面添加到agw AUI笔记本中

import wx
from ObjectListView import ObjectListView, ColumnDefn
from wx.lib.pubsub import pub
import ectworker as EW

TabLabel = 'Primary Output'
outputOne = []

class TabPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        headerFont = wx.Font(12, wx.MODERN, wx.SLANT, wx.NORMAL)
        title = wx.StaticText(self, -1, " Primary Output:")
        title.SetFont(headerFont)

        self.countDisplay = wx.StaticText(self, -1, '%s'%len(invOutput))
        self.countDisplay.SetFont(headerFont)

        self.dataOLV = ObjectListView(self, wx.ID_ANY,
            style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.setColumns()
        self.dataOLV.SetEmptyListMsg('Please click the show button.\n\
            If nothing appears then there is nothing to display')
        self.dataOLV.cellEditMode = ObjectListView.CELLEDIT_NONE

        updateBtn = wx.Button(self, wx.ID_ANY, 'Show')
        updateBtn.Bind(wx.EVT_BUTTON, self.updateControl)

        filterBtn = wx.Button(self, label='Filter')
        filterBtn.Bind(wx.EVT_BUTTON, self.filterInfo)

        lookupBtn = wx.Button(self, wx.ID_ANY, 'Look Up')
        lookupBtn.Bind(wx.EVT_BUTTON, self.onLookUp)

        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox0 = wx.BoxSizer(wx.HORIZONTAL)
        hbox0.Add(title, 0, wx.ALL, 5)
        hbox0.Add(self.countDisplay, 0, wx.ALL, 5)
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        hbox1.Add(updateBtn, 0, wx.ALL, 5)
        hbox1.Add(filterBtn, 0, wx.ALL, 5)
        hbox1.Add(lookupBtn, 0, wx.ALL, 5)
        vbox.Add(hbox0, 0, wx.EXPAND, 5)
        vbox.Add(self.dataOLV, 1, wx.ALL|wx.EXPAND, 5)
        vbox.Add(hbox1, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(vbox)

    def setColumns(self, data=None):
        self.idColumn = ColumnDefn('Dealer ID', 'left', -1, 'id')
        self.nameColumn = ColumnDefn('Dealer Name', 'left', -1, 'name')
        self.thirdColumn = ColumnDefn('Third', 'left', -1, 'third')
        self.fourthColumn = ColumnDefn('Fourth', 'left', -1, 'fourth')
        self.fifthColumn = ColumnDefn('Fifth', 'left', -1, 'fifth')
        self.sixthColumn = ColumnDefn('Sixth', 'right', -1, 'sixth')
        self.seventhColumn = ColumnDefn('Seventh', 'right', -1, 'seventh')
        self.olvColumns = [
            self.idColumn,
            self.nameColumn,
            self.thirdColumn,
            self.fourthColumn,
            self.fifthColumn,
            self.sixthColumn,
            self.seventhColumn]

        self.dataOLV.SetColumns(self.olvColumns)

    def updateControl(self, event):
        outputOne = EW.filterOne()
        self.updateOLV(outputOne)        

    def filterInfo(self, event):
        pub.sendMessage('dialog.filter', event=None)
        while EW.dataVars.theFilter == []:
            pub.sendMessage('dialog.filter', event=None)
        outputOne = EW.filterOne()
        self.updateOLV(outputOne)

    def updateOLV(self, object):
        self.dataOLV.SetObjects(object)
        self.countDisplay.SetLabel('%s'%len(object))

    def onLookUp(self, event):
      # This needs proper error handling
        selectedRow = self.dataOLV.GetSelectedObject()
        try:
            webbrowser.open('sc/%s' % selectedRow.id)
        except AttributeError:
            pass

if __name__ == '__main__':
    print('File file is not meant to be run as a stand alone application.')
    print('  Please try again by running the main program.')
我的主要问题是,在使用py2exe编译之后,如何让键盘快捷键Ctrl+C正常工作

在我收到“Try PyInstaller”的回复之前,我每次都会收到一条错误消息,但这是另一个可能的问题帖子

提前谢谢

--编辑--

我原以为这段代码就是我的解决方案,但我的最终结果是一堆混乱的外语

def onCtrlC(self, event):
    selectedRows = self.dataOLV.GetSelectedObjects()
    self.dataObj = wx.TextDataObject()
    self.dataObj.SetData('%s'%str(selectedRows))
    if wx.TheClipboard.Open():
        wx.TheClipboard.SetData(self.dataObj)
        wx.TheClipboard.Flush()
    else:
        pub.sendMessage('dialog.error', message='Unable to open the clipboard',
                        caption='Error')
我只是有根据地猜测我错过了什么

--编辑2--

让它按预期工作,感谢迈克·德里斯科尔,谢谢你! 我确实改变了我将数据放入剪贴板的方式,我不认为这是最有效的,但它是有效的。我还发现了为什么粘贴时会收到一堆乱七八糟的东西。代码如下,我正在使用多行TextCtrl临时存储数据,并在完成后将其清除

self.hiddenTxt = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.hiddenTxt.Hide()

def onCtrlC(self, event):
    selectedRows = self.dataOLV.GetSelectedObjects()
    for x in selectedRows:
        self.hiddenTxt.AppendText('%s\t%s\n'%(x.id, x.name))
    self.dataObj = wx.TextDataObject()
    self.dataObj.SetText(self.hiddenTxt.GetValue())
    if wx.TheClipboard.Open():
        wx.TheClipboard.SetData(self.dataObj)
        wx.TheClipboard.Flush()
    else:
        pub.sendMessage('dialog.error', message='Unable to open the clipboard',
                        caption='Error')
    self.hiddenTxt.SetValue('')
我搞错的部分是:

    self.dataObj.SetData
它实际上需要:

    self.dataObj.SetText
通过在每行的花絮之间使用\t,我可以毫无问题地粘贴到Excel中


非常感谢你,Mike D.

你可能需要明确地使用剪贴板来完成这项工作。我不知道你为什么这么想,但那是我的第一个想法。以下是有关该主题的两个教程:

我还想问一下wxPython用户列表/googlegroup。许多开发人员都在那里闲逛,他们可能会给您提供额外的提示:


感谢您的快速回复,我一定会查看这些链接,并与wxPython用户列表/Google组联系。这让我很困惑,为什么复制/粘贴在通过Python作为脚本运行时可以正常工作,而不是在使用py2exe创建Windows exe之后。我的第一个想法是py2exe可能会扭曲一些东西。尽管如此,我还是会明确地研究如何使用剪贴板。关于“捕获”Ctrl+C组合键并将其绑定到可以复制到剪贴板的函数,有什么建议吗?是的,这很奇怪。我完全同意你的看法。至于捕获组合键,我建议创建一个加速表。我在这里写过:我能够使用加速器表捕获Ctrl+C组合键,并从技术上将所选行的内容复制到系统剪贴板中。然而,粘贴这些数据产生了一些“奇怪”的结果。粘贴的数据杂乱无章。我已经在我的原始问题中添加了代码,我会将数据对象更改为逗号分隔的列表,或者更改为包含逗号的字符串,以伪造逗号分隔的列表。然后将列表或字符串添加到ClipBoard@MikeD谢谢,我确实尝试过逗号分隔,但在粘贴到Excel时仍然遇到问题,但我可以使用\t将其粘贴到Excel中,没有问题。我还注意到,在将文本添加到dataObj时,我使用的是SetData而不是SetText,这似乎是导致我的多语言输出的原因。我很高兴你能找到答案。