【问题标题】:wxpython cut copy and paste throughout the applicationwxpython 在整个应用程序中剪切复制和粘贴
【发布时间】:2011-11-27 18:53:03
【问题描述】:

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

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

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    菜单键绑定默认使用 Alt-first_menu_letter -> submenu_first_letter。
    选中项的菜单事件应该绑定对应的事件处理函数:

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

    对于复制方法,您首先用鼠标选择要复制的文本。然后您可以通过以下方式获取聚焦的小部件(带有要复制的所选字符串的特定文本控件):

    widget = self.FindFocus()
    

    现在您可以通过这种方式从该小部件中获取选定的字符串:

    self.copied = widget.GetStringSelection()
    

    将复制的文本粘贴到光标所在的 textctrl 中也必须这样做。 这里有一个工作示例:

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

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2015-02-08
      • 1970-01-01
      相关资源
      最近更新 更多