wxpython在整个应用程序中剪切复制和粘贴

时间:2011-11-27 18:53:03

标签: python user-interface wxpython

我正在开发一个带有多个TextCtrl和ComboBox小部件的小应用程序。我希望当我按下Ctrl-C Ctrl-V和Ctrl-X键时,我会在相应的条目中获得复制,粘贴和剪切的通常行为。

我现在获得的是,虽然我可以右键单击并使用文本copd / past / cutd,但我无法通过键绑定或菜单条目。我怎样才能以简单的方式获得这个?

1 个答案:

答案 0 :(得分:2)

菜单键绑定默认使用Alt-first_menu_letter - > submenu_first_letter。
所选项目的菜单事件应绑定相应的事件处理程序:

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()