Данные буфера обмена Python win32 усекаются

Я использую модуль Python под названием ObjectListView в качестве дополнения к 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()

Это код из модуля. Я ввел операторы печати для отладки. Я прокомментировал текст, который печатает. Эта проблема возникает только в этом модуле. Если я запускаю этот раздел кода в интерпретаторе Python, он работает нормально, и буфер обмена возвращает весь ввод.

Что может быть причиной этой проблемы?


person Thomas Enyard    schedule 18.12.2012    source источник


Ответы (3)


Когда строка обрезается до первого символа, первое, о чем я думаю, это то, что UTF-16 интерпретируется как 8-битный символ. Второй байт 2-байтовой последовательности UTF-16 для большинства европейских языков равен нулю и приводит к досрочному завершению строки. Попробуй это:

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

Я бы также использовал encode('utf-16le') при установке данных в буфер обмена.

person Mark Ransom    schedule 18.12.2012
comment
Фантастический! Спасибо, проблема была в кодировке. - person Thomas Enyard; 18.12.2012

Вместо использования ObjectListView для копирования и вставки вам следует попробовать методы, включенные в wxPython. Вот несколько соответствующих ссылок:

У меня никогда не было проблем с использованием этого для простых действий копирования и вставки.

person Mike Driscoll    schedule 18.12.2012

Я нашел похожий пост здесь: ярлык wxPython ObjectListView Capture Ctrl-C

У меня была такая же проблема, и я решил переопределить класс ObjectListView. Я все равно хотел скопировать только текст, и я использовал пример кода Майка Д., чтобы скопировать его в буфер обмена.

Я также воспользовался возможностью, чтобы скопировать текст столбца в качестве заголовка к своим данным. Это значительно упростило анализ информации, вставленной в 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")
person baumer5000    schedule 25.09.2014