wxpython 在应用程序中实现剪切、复制和粘贴

2 投票
1 回答
1232 浏览
提问于 2025-04-17 07:10

我正在开发一个小应用,里面有多个文本框和下拉框。我希望当我按下 Ctrl-C、Ctrl-V 和 Ctrl-X 这几个组合键时,能够像平常一样在相应的输入框里实现复制、粘贴和剪切的功能。

现在的情况是,我可以通过右键点击来实现文本的复制、粘贴和剪切,但通过键盘快捷键或者菜单选项却无法做到。我该如何简单地实现这个功能呢?

1 个回答

2

菜单的快捷键默认是通过按下Alt键加上菜单字母来打开子菜单的。
当你选择了某个菜单项后,应该把相应的事件处理程序绑定到这个菜单项上:

self.Bind(wx.EVT_MENU, self.on_copy, self.copy)

如果你想复制文本,首先要用鼠标选中你想复制的文本。然后,你可以通过以下方式获取当前聚焦的控件(也就是你选中的文本所在的具体文本框):

widget = self.FindFocus()

这样你就可以从这个控件中获取到选中的文本了:

self.copied = widget.GetStringSelection()

同样的操作也适用于将复制的文本粘贴到你放置光标的文本框中。这里有一个可以运行的例子:

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.tctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
        self.tctrl_2 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)

        self.menubar = wx.MenuBar()
        self.test = wx.Menu()
        self.copy = wx.MenuItem(self.test, wx.NewId(), "copy", "is_going to copy", wx.ITEM_NORMAL)
        self.test.AppendItem(self.copy)
        self.paste = wx.MenuItem(self.test, wx.NewId(), "paste", "will paste", wx.ITEM_NORMAL)
        self.test.AppendItem(self.paste)
        self.menubar.Append(self.test, "Test")
        self.SetMenuBar(self.menubar)

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_MENU, self.on_copy, self.copy)
        self.Bind(wx.EVT_MENU, self.on_paste, self.paste)

    def __set_properties(self):
        self.SetTitle("frame_1")

    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.tctrl_1, 1, wx.EXPAND, 0)
        sizer_2.Add(self.tctrl_2, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()

    def on_copy(self, event): 
        widget = self.FindFocus()
        self.copied = widget.GetStringSelection()

    def on_paste(self, event): 
        widget = self.FindFocus()
        widget.WriteText(self.copied)


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    frame = MyFrame(None, -1, "")
    frame.Show()
    app.MainLoop()

撰写回答