在wxpython中从一个TextCtrl复制、剪切、粘贴并全选文本到另一个文本框

1 投票
1 回答
2975 浏览
提问于 2025-04-17 10:55

我想在两个文本框之间进行剪切、粘贴、复制和选择文本。有没有人能帮帮我,我已经卡了好几个小时了。请看下面的代码,谢谢大家的帮助...

import wx
import os

class Editor(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(600, 500))

        # setting up menubar
        menubar = wx.MenuBar()

        edit = wx.Menu()
        cut = wx.MenuItem(edit, 106, '&Cut\tCtrl+X', 'Cut the Selection')
        edit.AppendItem(cut)

        copy = wx.MenuItem(edit, 107, '&Copy\tCtrl+C', 'Copy the Selection')
        edit.AppendItem(copy)

        paste = wx.MenuItem(edit, 108, '&Paste\tCtrl+V', 'Paste text from clipboard')
        edit.AppendItem(paste)

        delete = wx.MenuItem(edit, 109, '&Delete', 'Delete the selected text')
        edit.AppendItem(delete)

        edit.Append(110, 'Select &All\tCtrl+A', 'Select the entire text')

        menubar.Append(edit, '&Edit')
        self.SetMenuBar(menubar)

        self.Bind(wx.EVT_MENU, self.OnCut, id=106)
        self.Bind(wx.EVT_MENU, self.OnCopy, id=107)
        self.Bind(wx.EVT_MENU, self.OnPaste, id=108)
        self.Bind(wx.EVT_MENU, self.OnDelete, id=109)
        self.Bind(wx.EVT_MENU, self.OnSelectAll, id=110)

        self.text = wx.TextCtrl(self, -1, '', (110,55),(120, -1))
        self.text = wx.TextCtrl(self, -1, '', (110,95),(120, -1))
        self.text.SetFocus()

        self.Centre()
        self.Show(True)

    def OnCut(self, event):
         self.text.Cut()

    def OnCopy(self, event):
         self.text.Copy()

    def OnPaste(self, event):
        self.text.Paste()

    def OnDelete(self, event):
        frm, to = self.text.GetSelection()
        self.text.Remove(frm, to)

    def OnSelectAll(self, event):
       self.text.SelectAll()


app = wx.App()
Editor(None, -1, 'Editor')
app.MainLoop() 

1 个回答

2

你需要知道从哪个 wx.TextCtrl 实例中剪切、复制或者粘贴文本。在你提供的代码片段中,你尝试使用 self.text,但是正如 Velociraptors 所说的,你初始化了两次 self.text,所以你失去了对第一个 wx.TextCtrl 的访问。因此,首先你需要获取你正在使用的 wx.TextCtrl 实例,然后再使用它的方法。这可以通过 wx.Frame.FindFocus() 这个类来实现,它会返回当前在框架中获得焦点的控件(或者返回 None)。

所以,对于 Cut,我们可以这样做:

def OnCut(self, event):
    text = self.FindFocus()
    if text is not None:
        text.Cut()

其他方法也可以用同样的方式进行修改。

撰写回答