Python win32clipboard数据被截断

时间:2012-12-18 15:26:38

标签: python wxpython clipboard objectlistview

我使用名为ObjectListView的Python模块作为wxPython的补充。我正在使用python2.7和wxPython 2.8.1.2.1

我的问题是将信息复制到Windows剪贴板。模块ObjectListView有一个使用win32clipboard在剪贴板中存储信息的部分。但是,在检索信息时,只返回第一个字符。 。没什么别的。

    try:
        win32clipboard.OpenClipboard(0)
        win32clipboard.EmptyClipboard()
        cfText = 1
        print txt #prints 'hello world'
        win32clipboard.SetClipboardData(cfText, txt)
        print htmlForClipboard #prints html output
        cfHtml = win32clipboard.RegisterClipboardFormat("HTML Format")
        win32clipboard.SetClipboardData(cfHtml, htmlForClipboard)
        print win32clipboard.GetClipboardData() #prints 'h'
    finally:
        win32clipboard.CloseClipboard()

这是模块的代码。我已输入print语句进行调试。我评论了打印的文字。此问题仅发生在此模块中。如果我在python解释器中运行该部分代码,它运行正常,剪贴板返回整个输入。

可能导致此问题的原因是什么?

3 个答案:

答案 0 :(得分:3)

当一个字符串被剪切到第一个字符时,我首先想到的是UTF-16被解释为一个8位字符。大多数欧洲语言的2字节UTF-16序列的第二个字节为零,并导致字符串提前终止。试试这个:

print win32clipboard.GetClipboardData().decode('utf-16le')

在将数据设置到剪贴板时,我也会使用encode('utf-16le')

答案 1 :(得分:0)

您应该尝试使用wxPython中包含的方法,而不是使用ObjectListView进行复制和粘贴。以下是一些相关链接:

我使用它进行简单的复制和粘贴操作时从未遇到任何问题。

答案 2 :(得分:0)

我在这里找到了类似的帖子:wxPython ObjectListView Capture Ctrl-C shortcut

我遇到了同样的问题并决定覆盖ObjectListView类。我只想要复制文本,我使用Mike D的示例代码将其复制到剪贴板。

我还借此机会将列文本作为标题复制到我的数据中。这使得粘贴到Excel中的信息更容易解析。

这是我的代码:

class MyOLVClass(ObjectListView):
    def CopyObjectsToClipboard(self, objects):
        """
        Put a textual representation of the given objects onto the clipboard.

        This will be one line per object and tab-separated values per line.
        """
        if objects is None or len(objects) == 0:
            return

        # Get the column header text
        h = []
        for n in range(self.GetColumnCount()):
            col = self.GetColumn(n)
            h.append(col.GetText())
        header = '\t'.join(h)

        # Get all the values of the given rows into multi-list
        rows = self._GetValuesAsMultiList(objects)

        # Make a text version of the values
        lines = [ "\t".join(x) for x in rows ]
        txt = header + '\n' + "\n".join(lines) + "\n"

        self.dataObj = wx.TextDataObject()
        self.dataObj.SetText(txt)
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(self.dataObj)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Unable to open the clipboard", "Error")