2011-11-27 49 views
2

我正在開發一個帶有多個TextCtrl和ComboBox小部件的小應用程序。我希望當我按下Ctrl-C Ctrl-V和Ctrl-X鍵時,我會在正確的條目中獲得複製,粘貼和剪切的通常行爲。wxpython剪切複製和粘貼整個應用程序

我現在得到的是,雖然我可以右鍵單擊並使文本copd/past/cutd,但我無法通過鍵綁定或菜單條目。我怎樣才能以簡單的方式獲得這個?

回答

2

菜單鍵綁定默認使用Alt-first_menu_letter - > submenu_first_letter。
所選項目的菜單事件應綁定相應的事件處理程序:

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

的複製方法,您首先選擇要使用鼠標複製的文本。然後你就可以得到集中的小部件(與要複製的選擇字符串的具體textcontrol)有:

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

完美的作品!謝謝 – pygabriel

相關問題