1

嗨,我是 python 新手,否则我是自学成才的程序员。

我正在尝试让复制和粘贴方法适用于 wxpython 中的剪贴板。

我已经找到并实现了我在该主题上找到的内容,但是在我的 mac 计算机(OS X 10.10.5)上使用时出现问题。

附加的代码是一个示例应用程序,它本身可以正常工作(给定网格限制)。它也适用于从网格单元复制并粘贴到外部记事本或电子表格。对我而言,这意味着 SetData 在构建剪贴板数据时正在获取和维护制表符分隔符和新行。

但是,如果我从同一个记事本或电子表格中选择制表符分隔和多行数据并继续粘贴到网格中,我会得到一列数据。这对我来说意味着制表符分隔符和换行符在 GetData 中丢失了。

随着数据选择

1 2 3

4 5 6

在电子表格中。

按照建议,使用 print repr(data) 获取剪贴板所保存的内容,在应用程序中复制和粘贴时会导致粘贴数据 - print repr(data) = u'1\t2\t3\n4\t5\t6\n'

当从外部源复制数据并粘贴时似乎只有 \r 返回字符和 ufeff ?? 我不知道?也许那是一把钥匙?(在 Mac 上)

打印 repr(数据) = u'\ufeff\r1\r2\r3\r4\r5\r6\r\r'

现在这在我的 Windows 机器上运行良好,但在我的 Mac 上却不行。

这是一个已知的问题?是否有解决方法,或者是否有我遗漏或不理解的设置?

非常感谢任何帮助或指导。谢谢弗兰克

import wx
import wx.grid as dg



class cp(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, wx.ID_ANY, size = (600,600))

        self.dgGrid = dg.Grid(self, size = (500,500))
        self.dgGrid.CreateGrid(10,5)

        self.dgGrid.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress)



    def OnKeyPress(self, event):

        # If Ctrl+V is pressed...
        if event.ControlDown() and event.GetKeyCode() == 86:
            print "Ctrl+V"
            # Call paste method
            self.Paste()
        if event.ControlDown() and event.GetKeyCode() == 67:
            print "Ctrl+C"
            # Call copy method
            self.copy()     

        event.Skip()    

    def copy(self):
        print "Copy method"
        # Number of rows and cols
        rows = self.dgGrid.GetSelectionBlockBottomRight()[0][0] - self.dgGrid.GetSelectionBlockTopLeft()[0][0] + 1
        cols = self.dgGrid.GetSelectionBlockBottomRight()[0][1] - self.dgGrid.GetSelectionBlockTopLeft()[0][1] + 1

        # data variable contain text that must be set in the clipboard
        data = ''

        # For each cell in selected range append the cell value in the data variable
        # Tabs '\t' for cols and '\r' for rows
        for r in range(rows):
            for c in range(cols):
                data = data + str(self.dgGrid.GetCellValue(self.dgGrid.GetSelectionBlockTopLeft()[0][0] + r, self.dgGrid.GetSelectionBlockTopLeft()[0][1] + c))
                if c < cols - 1:
                    data = data + '\t'
            data = data + '\n'
        # Create text data object
        clipboard = wx.TextDataObject()
        # Set data object value
        clipboard.SetText(data)
        # Put the data in the clipboard
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(clipboard)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Can't open the clipboard", "Error")



    def Paste(self):
        print "Paste method"
        clipboard = wx.TextDataObject()


        if wx.TheClipboard.Open():
            wx.TheClipboard.GetData(clipboard)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Can't open the clipboard", "Error")
            return

        data = clipboard.GetText()

        y = -1
        # Convert text in a array of lines
        for r in data.splitlines():
            y = y +1
            x = -1
            print r
            # Convert c in a array of text separated by tab
            for c in r.split('\t'):
                x = x +1
                print c
                self.dgGrid.SetCellValue(self.dgGrid.GetGridCursorRow() + y, self.dgGrid.GetGridCursorCol() + x, c)


if __name__ == '__main__':
    print ' running locally not imported '


    app = wx.App(False)
    MainFrame = wx.Frame(None, title = "TestingCopy and Paste", size = (600,600))


    cppanel = cp(MainFrame)

    MainFrame.Refresh()


    MainFrame.Show()

    app.MainLoop()
4

0 回答 0