Рубрики
Без рубрики

WxPython: Как использовать буфер обмена

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Каждый, кто использует компьютеры регулярно знает, что они могут скопировать и вставлять текст. То, что они могут не знать, это то, что когда вы копируете что-то, он входит в расположение, известное как «буфер обмена». Большинство программ предоставляют доступ к буфере обмена каким-то образом, будь то только в самой программе или в системной буфер обмена, что позволяет копировать элементы в другие приложения. Toolkit WxPython GUI Toolkit также предоставляет доступ в буфер обмена, который вы можете использовать для копирования текста в и из своей программы и даже в систему буфера обмена. Вы также можете скопировать изображения в буфер обмена. В этом руководстве мы посмотрим, как вы можете сделать это в своем собственном коде.

Мы начнем с действительно простым примером кода-фрагмента. Следующее содержит две кнопки, которые копируют любой текст, который добавляется в текстовое управление, а вы можете затем вставить в другом месте, например, в текстовом поле, в поисковой системе или что-то еще. Другая кнопка также копирует в буфер обмена, а затем закрывает приложение после промывки данных. Это должно сделать данные доступными в системной буфер обмена даже после закрытия приложения. Оба работают отлично в Windows, но WXGTK (I.E. Версия Linux) не работает в последнем случае. Увидеть Билет на ошибку для дополнительной информации.

Во всяком случае, давайте посмотрим на код!

import wx

########################################################################
class ClipboardPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        
        lbl = wx.StaticText(self, label="Enter text to copy to clipboard:")
        self.text = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        copyBtn = wx.Button(self, label="Copy")
        copyBtn.Bind(wx.EVT_BUTTON, self.onCopy)
        copyFlushBtn = wx.Button(self, label="Copy and Flush")
        copyFlushBtn.Bind(wx.EVT_BUTTON, self.onCopyAndFlush)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(lbl, 0, wx.ALL, 5)
        sizer.Add(self.text, 1, wx.EXPAND)
        sizer.Add(copyBtn, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(copyFlushBtn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onCopy(self, event):
        """"""
        self.dataObj = wx.TextDataObject()
        self.dataObj.SetText(self.text.GetValue())
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(self.dataObj)
            wx.TheClipboard.Close()
        else:
            wx.MessageBox("Unable to open the clipboard", "Error")
            
    #----------------------------------------------------------------------
    def onCopyAndFlush(self, event):
        """"""
        self.dataObj = wx.TextDataObject()
        self.dataObj.SetText(self.text.GetValue())
        if wx.TheClipboard.Open():
            wx.TheClipboard.SetData(self.dataObj)
            wx.TheClipboard.Flush()
        else:
            wx.MessageBox("Unable to open the clipboard", "Error")
            
        self.GetParent().Close()

########################################################################
class ClipboardFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Clipboard Tutorial")
        panel = ClipboardPanel(self)
        self.Show()
    
    
if __name__ == "__main__":
    app = wx.App(False)
    frame = ClipboardFrame()
    app.MainLoop()
    

Как вы уже догадались, мужество этого сценария находятся в обработке событий кнопок. Главный бит – wx.textdataObject который будет хранить данные из текста управления. Далее мы пытаемся открыть буфер обмена. Если мы успешны, мы добавляем наш текст в буфер обмена, а затем закрыть его. Данные сейчас там для вставки. Второй обработчик событий делает то же самое, но оно промывается в буфер обмена, а не просто закрывает его. Если вы хотите скопировать растровое изображение вместо этого, то вы хотите использовать wx.bitmapdataObject и пропустите это wx.bitmap объект. В противном случае остальные одинаковы.

Обертывание

Теперь вы знаете, как использовать буфер обмена из WxPython! Выйдите туда и начните создавать что-то, чтобы удивить своих друзей и незнакомцев!

Дополнительные ресурсы