Как сделать функциональный пункт меню «Очистить буфер обмена»? - PullRequest
0 голосов
/ 28 октября 2018

Я попытался создать функциональный пункт меню «Очистить буфер обмена», но он не работает.Консоль не показывает никаких ошибок.Есть идеи, что происходит?

Редактор:

import wx
import wx.stc as stc

class Window(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(500, 500))
        self.control = stc.StyledTextCtrl(self, style=wx.TE_MULTILINE | wx.TE_WORDWRAP)
        self.clipboard = wx.Clipboard()
        self.EditMenu(), self.BindsMenu(), self.MenuBar()
    def EditMenu(self):
        self.editmenu = wx.Menu()
        self.clear_clipboard = self.editmenu.Append(wx.ID_ANY, "&Clear Clipboard\tCtrl+Del", "Clear clipboard")
    def MenuBar(self):
        self.menu = wx.MenuBar()
        self.menu.Append(self.editmenu, "&Edit")
        self.SetMenuBar(self.menu)
    def BindsMenu(self):
        self.Bind(wx.EVT_MENU, self.ClearClipboard, self.clear_clipboard)
    def ClearClipboard(self, e):
        self.clipboard.Clear()

def main():
    app = wx.App()
    frame = Window(None, "Text Editor")
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

Спасибо

1 Ответ

0 голосов
/ 31 октября 2018

В clipboard есть ошибка, по крайней мере, в Linux в wx 4.0.3
Если вы определите свой собственный wx.Clipboard и используете его, вы получите следующее сообщение об ошибке:

/home/vagrant/wxPython-4.0.3/ext/wxWidgets/src/gtk/clipbrd.cpp(91): assert "clipboard == ms_clipboard" failed in OnDone(): got notification for alien clipboard

В сообщении указывается, что платформа Linux не принимается во внимание, т. Е. Ссылка на ms_clipboard
Однако, если вы используете wx.TheClipboard, он работает хорошо, т.е.

import wx
import wx.stc as stc

class Window(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(500, 500))
        self.control = stc.StyledTextCtrl(self, style=wx.TE_MULTILINE | wx.TE_WORDWRAP)
        self.EditMenu()
        self.BindsMenu()
        self.MenuBar()

    def EditMenu(self):
        self.editmenu = wx.Menu()
        self.copy_clipboard = self.editmenu.Append(wx.ID_ANY, "&Copy to Clipboard", "Copy to clipboard")
        self.clear_clipboard = self.editmenu.Append(wx.ID_ANY, "C&lear Clipboard", "Clear clipboard")
        self.paste_clipboard = self.editmenu.Append(wx.ID_ANY, "&Paste Clipboard", "Paste clipboard")

    def MenuBar(self):
        self.menu = wx.MenuBar()
        self.menu.Append(self.editmenu, "&Edit")
        self.SetMenuBar(self.menu)

    def BindsMenu(self):
        self.Bind(wx.EVT_MENU, self.CopyClipboard, self.copy_clipboard)
        self.Bind(wx.EVT_MENU, self.ClearClipboard, self.clear_clipboard)
        self.Bind(wx.EVT_MENU, self.PasteClipboard, self.paste_clipboard)

    def ClearClipboard(self, e):
        wx.TheClipboard.Open()
        wx.TheClipboard.Clear()
        wx.TheClipboard.Close()

    def CopyClipboard(self, e):
        clipdata = wx.TextDataObject()
        copy_data = self.control.GetSelectedText()
        if copy_data:
            clipdata.SetText(copy_data)
            wx.TheClipboard.Open()
            wx.TheClipboard.SetData(clipdata)
            wx.TheClipboard.Close()

    def PasteClipboard(self, e):
        clipdata = wx.TextDataObject()
        wx.TheClipboard.Open()
        wx.TheClipboard.GetData(clipdata)
        wx.TheClipboard.Close()
        self.control.AddText(clipdata.GetText())

def main():
    app = wx.App()
    frame = Window(None, "Text Editor")
    frame.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()
...