Все, кто ежедневно использует компьютер, знает, можно копировать и вставлять текст. Но вот многие не знают, что когда они что-то копируют, то оно попадает в место, которое называется «Буфер обмена». Большинство программ используют данную технологию или её аналоги: это может быть буфер обмена для перемещения файлов внутри приложения, или системный буфер обмена, который позволяет копировать объекты из одного приложения в другое.
Набор инструментов интерфейса wxPython также предоставляет подобную возможность, позволяя вам использовать текст, скопированный из других программ или находящийся в системном буфере обмена. Вы также можете копировать изображения в буфер обмена. В данной статье, мы рассмотрим примеры того, как вы сможете внедрить этот метод в свой код.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Все, кто ежедневно использует компьютер, знает, можно копировать и вставлять текст. Но вот многие не знают, что когда они что-то копируют, то оно попадает в место, которое называется «Буфер обмена». Большинство программ используют данную технологию или её аналоги: это может быть буфер обмена для перемещения файлов внутри приложения, или системный буфер обмена, который позволяет копировать объекты из одного приложения в другое.
Набор инструментов интерфейса wxPython также предоставляет подобную возможность, позволяя вам использовать текст, скопированный из других программ или находящийся в системном буфере обмена. Вы также можете копировать изображения в буфер обмена. В данной статье, мы рассмотрим примеры того, как вы сможете внедрить этот метод в свой код.
Мы научимся пользоваться буфером обмена на одном простом примере. Код, который вы найдёте ниже, содержит две кнопки, одна из которых копирует любой текст, находящийся в текстовом поле, и который вы можете вставить куда угодно, например, в строку текста, поисковик или ещё-куда.
Вторая также копирует текст в буфер обмена, но делает его доступным даже после того, как вы закроете само приложение. Таким образом данные должны быть доступны из системного буфера обмена. Обе кнопки отлично работают на Windows, но wxGTK (например, версия для Linux) не будет работать во втором случае. Вы можете изучить тему о баге, чтобы узнать почему так происходит.
Как бы то ни было, давайте взглянем на код!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
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. В остальном, всё идентично.
Примечание: Метод копирования и стирания может не работать на всех операционных системах. Например, у меня он работает на Windows 7, но не запускается на Xubuntu 14.04.
Итоги
Буфер обмена – очень удобная вещь, и я использую его практически беспрерывно всегда, когда нахожусь за компьютером. Так что невозможность его использования может очень сильно разочаровать конечного пользователя. К счастью, с помощью wxPython довольно просто сделать собственное приложение, поддерживающее буфер обмена. Так что теперь вы знаете как предотвратить недоумение, вызванное отсутствием буфера обмена у ваших пользователей.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»