我使用名为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解释器中运行该部分代码,它运行正常,剪贴板返回整个输入。
可能导致此问题的原因是什么?
答案 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")